{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3 - 通过联合学习对齐和翻译实现神经机器翻译\n",
    "\n",
    "在这个使用Mindspore的序列到序列模型的第三个笔记本中，我们将实现来自[Neural Machine Translation by Jointly Learning to Align and Translate](https://arxiv.org/abs/1409.0473)的模型。与先前模型相比，该模型实现了我们迄今为止的最佳困惑度。\n",
    "\n",
    "## 简介\n",
    "\n",
    "作为提醒，这是一般的编码器-解码器模型：\n",
    "\n",
    "![](assets/seq2seq1.png)\n",
    "\n",
    "在先前的模型中，我们的架构被设置为通过在每个时间步将上下文向量$z$明确传递给解码器，并通过在每个时间步将上下文向量和嵌入的输入词$d(y_t)$以及隐藏状态$s_t$传递给线性层$f$来减少“信息压缩”。\n",
    "\n",
    "![](assets/seq2seq7.png)\n",
    "\n",
    "即使我们减少了一些这种压缩，我们的上下文向量仍然需要包含有关源句的所有信息。本笔记本中实现的模型通过允许解码器在每个解码步骤中查看整个源句（通过其隐藏状态）来避免此压缩！它是如何做到这一点的呢？它使用*注意力*。\n",
    "\n",
    "注意力通过首先计算一个与源句长度相同的注意力向量$a$来工作。注意向量具有每个元素都在0到1之间的属性，并且整个向量总和为1。然后，我们计算我们的源句隐藏状态$H$的加权和，以获得加权源向量$w$。\n",
    "\n",
    "$$w = \\sum_{i}a_ih_i$$\n",
    "\n",
    "在解码时，我们在每个时间步计算一个新的加权源向量，将其用作解码器RNN的输入，以及用于进行预测的线性层。我们将在教程中解释如何完成所有这些。\n",
    "\n",
    "## 准备数据\n",
    "\n",
    "再次，准备工作与上次相似。\n",
    "\n",
    "首先，导入所有所需的模块。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: http://repo.myhuaweicloud.com/repository/pypi/simple\n",
      "Collecting https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.5.0/en_core_web_sm-3.5.0.tar.gz\n",
      "  Downloading https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.5.0/en_core_web_sm-3.5.0.tar.gz (12.8 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.8/12.8 MB\u001b[0m \u001b[31m33.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25hCollecting spacy<3.6.0,>=3.5.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/6e/92/30546ea83e12430a9e77b0181f33d647c38f78563da8ecb472e303df7ae4/spacy-3.5.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.5 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.5/6.5 MB\u001b[0m \u001b[31m35.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hCollecting requests<3.0.0,>=2.13.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl (62 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.6/62.6 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: numpy>=1.15.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en-core-web-sm==3.5.0) (1.21.6)\n",
      "Collecting pydantic!=1.8,!=1.8.1,<1.11.0,>=1.7.4\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/97/aa/f46e092677f88a24be02db17a1a527d3aec36088b250d1ffd42f40a771c7/pydantic-1.10.22-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m28.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: packaging>=20.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en-core-web-sm==3.5.0) (24.0)\n",
      "Collecting spacy-legacy<3.1.0,>=3.0.11\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/c3/55/12e842c70ff8828e34e543a2c7176dac4da006ca6901c9e8b43efab8bc6b/spacy_legacy-3.0.12-py2.py3-none-any.whl (29 kB)\n",
      "Collecting thinc<8.2.0,>=8.1.8\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/af/ac/07cdaadb23c42f72aa9155f77714ad538bbcaaaf75e6c059de71532a299c/thinc-8.1.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (918 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m918.7/918.7 kB\u001b[0m \u001b[31m23.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hCollecting srsly<3.0.0,>=2.4.3\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/6b/ed/f0472546e45e516c8a46c4019deafa67d4e94a4ef813ba3d3ee5491b027f/srsly-2.4.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (491 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m491.8/491.8 kB\u001b[0m \u001b[31m33.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting spacy-loggers<2.0.0,>=1.0.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/33/78/d1a1a026ef3af911159398c939b1509d5c36fe524c7b644f34a5146c4e16/spacy_loggers-1.0.5-py3-none-any.whl (22 kB)\n",
      "Collecting typer<0.10.0,>=0.3.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/62/39/82c9d3e10979851847361d922a373bdfef4091020da7f893acfaf07c0225/typer-0.9.4-py3-none-any.whl (45 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m46.0/46.0 kB\u001b[0m \u001b[31m7.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting cymem<2.1.0,>=2.0.2\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/f2/4a/1acd761fb6ac4c560e823ce40536a62f886f2d59b2763b5c3fc7e9d92101/cymem-2.0.11.tar.gz (10 kB)\n",
      "  Installing build dependencies ... \u001b[?25ldone\n",
      "\u001b[?25h  Getting requirements to build wheel ... \u001b[?25ldone\n",
      "\u001b[?25h  Installing backend dependencies ... \u001b[?25ldone\n",
      "\u001b[?25h  Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n",
      "\u001b[?25hCollecting typing-extensions<4.5.0,>=3.7.4.1\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/0b/8e/f1a0a5a76cfef77e1eb6004cb49e5f8d72634da638420b9ea492ce8305e8/typing_extensions-4.4.0-py3-none-any.whl (26 kB)\n",
      "Collecting smart-open<7.0.0,>=5.2.1\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/fc/d9/d97f1db64b09278aba64e8c81b5d322d436132df5741c518f3823824fae0/smart_open-6.4.0-py3-none-any.whl (57 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m57.0/57.0 kB\u001b[0m \u001b[31m9.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: setuptools in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en-core-web-sm==3.5.0) (65.6.3)\n",
      "Collecting catalogue<2.1.0,>=2.0.6\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/9e/96/d32b941a501ab566a16358d68b6eb4e4acc373fab3c3c4d7d9e649f7b4bb/catalogue-2.0.10-py3-none-any.whl (17 kB)\n",
      "Collecting preshed<3.1.0,>=3.0.2\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/d6/3c/95cf48030c0b45378988cafffcfd6948b932aedfc7924d6559c2628a399c/preshed-3.0.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (151 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m151.3/151.3 kB\u001b[0m \u001b[31m12.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pathy>=0.10.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/0e/6b/d64babaaeaea0311e55a193d6385bcd2b342e30158ce336cbc05eae7fec6/pathy-0.10.3-py3-none-any.whl (48 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.9/48.9 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting langcodes<4.0.0,>=3.2.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/fe/c3/0d04d248624a181e57c2870127dfa8d371973561caf54333c85e8f9133a2/langcodes-3.3.0-py3-none-any.whl (181 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m181.6/181.6 kB\u001b[0m \u001b[31m22.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting murmurhash<1.1.0,>=0.28.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/64/d9/e7c6a7d4e9b5320c17e54af6f9edd2f521c6f86bbbb72aba571f641a9793/murmurhash-1.0.12.tar.gz (13 kB)\n",
      "  Installing build dependencies ... \u001b[?25ldone\n",
      "\u001b[?25h  Getting requirements to build wheel ... \u001b[?25ldone\n",
      "\u001b[?25h  Installing backend dependencies ... \u001b[?25ldone\n",
      "\u001b[?25h  Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n",
      "\u001b[?25hCollecting jinja2\n",
      "  Using cached http://repo.myhuaweicloud.com/repository/pypi/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl (134 kB)\n",
      "Collecting tqdm<5.0.0,>=4.38.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl (78 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m78.5/78.5 kB\u001b[0m \u001b[31m9.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting wasabi<1.2.0,>=0.9.1\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/06/7c/34330a89da55610daa5f245ddce5aab81244321101614751e7537f125133/wasabi-1.1.3-py3-none-any.whl (27 kB)\n",
      "Collecting zipp>=0.5\n",
      "  Using cached http://repo.myhuaweicloud.com/repository/pypi/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl (6.8 kB)\n",
      "Collecting urllib3<3,>=1.21.1\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/d2/b2/b157855192a68541a91ba7b2bbcb91f1b4faa51f8bae38d8005c034be524/urllib3-2.0.7-py3-none-any.whl (124 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m124.2/124.2 kB\u001b[0m \u001b[31m14.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting charset-normalizer<4,>=2\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/38/84/cec08586c7c294e2c5e984de797c15b3efb30d42a0dd0132a62d2dfe3a27/charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (141 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m141.3/141.3 kB\u001b[0m \u001b[31m19.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: certifi>=2017.4.17 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->en-core-web-sm==3.5.0) (2022.12.7)\n",
      "Collecting idna<4,>=2.5\n",
      "  Using cached http://repo.myhuaweicloud.com/repository/pypi/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl (70 kB)\n",
      "Collecting blis<0.8.0,>=0.7.8\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/bf/10/6dee8558f97a511fdfcc8ade9ad488ccd7899e063890f72c2d1c4e05f69e/blis-0.7.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.2 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.2/10.2 MB\u001b[0m \u001b[31m78.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hCollecting confection<1.0.0,>=0.0.1\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/0c/00/3106b1854b45bd0474ced037dfe6b73b90fe68a68968cef47c23de3d43d2/confection-0.1.5-py3-none-any.whl (35 kB)\n",
      "Collecting click<9.0.0,>=7.1.1\n",
      "  Using cached http://repo.myhuaweicloud.com/repository/pypi/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl (98 kB)\n",
      "Collecting MarkupSafe>=2.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/4a/1d/c4f5016f87ced614eacc7d5fb85b25bcc0ff53e8f058d069fc8cbfdc3c7a/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25 kB)\n",
      "Collecting importlib-metadata\n",
      "  Using cached http://repo.myhuaweicloud.com/repository/pypi/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl (22 kB)\n",
      "Building wheels for collected packages: en-core-web-sm, cymem, murmurhash\n",
      "  Building wheel for en-core-web-sm (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for en-core-web-sm: filename=en_core_web_sm-3.5.0-py3-none-any.whl size=12803284 sha256=9198ab35ab5f584f36425ad46fdbd5ac5af3793c8928ea5bf30cfd525856f46d\n",
      "  Stored in directory: /home/ma-user/.cache/pip/wheels/a9/9f/06/14e8ae07b6b5f4ada9dc13f70a4189aeb763babf315349b871\n",
      "  Building wheel for cymem (pyproject.toml) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for cymem: filename=cymem-2.0.11-cp37-cp37m-linux_x86_64.whl size=169430 sha256=e98c751ae9d2275aa2d899b3d55932ba469ff43aea88b56c62844f888fb9cc9b\n",
      "  Stored in directory: /home/ma-user/.cache/pip/wheels/1c/bc/b5/20fedd51c4420b4501ef5046f395a4c34ac866afdb663e9a98\n",
      "  Building wheel for murmurhash (pyproject.toml) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for murmurhash: filename=murmurhash-1.0.12-cp37-cp37m-linux_x86_64.whl size=102526 sha256=964af8010c3520bea92d42c8ef3c1fbe94d02e7294b6eac96ba74bf6a82f0e4b\n",
      "  Stored in directory: /home/ma-user/.cache/pip/wheels/98/cb/31/23d174547b863525f23e574d2dd8dbbd9c3cc99d04491b3a40\n",
      "Successfully built en-core-web-sm cymem murmurhash\n",
      "Installing collected packages: cymem, zipp, urllib3, typing-extensions, tqdm, spacy-loggers, spacy-legacy, smart-open, murmurhash, MarkupSafe, langcodes, idna, charset-normalizer, blis, wasabi, requests, pydantic, preshed, jinja2, importlib-metadata, catalogue, srsly, click, typer, confection, thinc, pathy, spacy, en-core-web-sm\n",
      "  Attempting uninstall: typing-extensions\n",
      "    Found existing installation: typing_extensions 4.7.1\n",
      "    Uninstalling typing_extensions-4.7.1:\n",
      "      Successfully uninstalled typing_extensions-4.7.1\n",
      "Successfully installed MarkupSafe-2.1.5 blis-0.7.11 catalogue-2.0.10 charset-normalizer-3.4.2 click-8.1.8 confection-0.1.5 cymem-2.0.11 en-core-web-sm-3.5.0 idna-3.10 importlib-metadata-6.7.0 jinja2-3.1.6 langcodes-3.3.0 murmurhash-1.0.12 pathy-0.10.3 preshed-3.0.9 pydantic-1.10.22 requests-2.31.0 smart-open-6.4.0 spacy-3.5.4 spacy-legacy-3.0.12 spacy-loggers-1.0.5 srsly-2.4.8 thinc-8.1.12 tqdm-4.67.1 typer-0.9.4 typing-extensions-4.4.0 urllib3-2.0.7 wasabi-1.1.3 zipp-3.15.0\n",
      "Looking in indexes: http://repo.myhuaweicloud.com/repository/pypi/simple\n",
      "Collecting https://github.com/explosion/spacy-models/releases/download/de_core_news_sm-3.5.0/de_core_news_sm-3.5.0.tar.gz\n",
      "  Downloading https://github.com/explosion/spacy-models/releases/download/de_core_news_sm-3.5.0/de_core_news_sm-3.5.0.tar.gz (14.6 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m14.6/14.6 MB\u001b[0m \u001b[31m3.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25hRequirement already satisfied: spacy<3.6.0,>=3.5.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from de-core-news-sm==3.5.0) (3.5.4)\n",
      "Requirement already satisfied: catalogue<2.1.0,>=2.0.6 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (2.0.10)\n",
      "Requirement already satisfied: packaging>=20.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (24.0)\n",
      "Requirement already satisfied: typer<0.10.0,>=0.3.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (0.9.4)\n",
      "Requirement already satisfied: smart-open<7.0.0,>=5.2.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (6.4.0)\n",
      "Requirement already satisfied: numpy>=1.15.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (1.21.6)\n",
      "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (4.67.1)\n",
      "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (3.0.9)\n",
      "Requirement already satisfied: setuptools in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (65.6.3)\n",
      "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (2.31.0)\n",
      "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (1.0.12)\n",
      "Requirement already satisfied: typing-extensions<4.5.0,>=3.7.4.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (4.4.0)\n",
      "Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.11 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (3.0.12)\n",
      "Requirement already satisfied: pydantic!=1.8,!=1.8.1,<1.11.0,>=1.7.4 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (1.10.22)\n",
      "Requirement already satisfied: langcodes<4.0.0,>=3.2.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (3.3.0)\n",
      "Requirement already satisfied: srsly<3.0.0,>=2.4.3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (2.4.8)\n",
      "Requirement already satisfied: thinc<8.2.0,>=8.1.8 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (8.1.12)\n",
      "Requirement already satisfied: wasabi<1.2.0,>=0.9.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (1.1.3)\n",
      "Requirement already satisfied: jinja2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (3.1.6)\n",
      "Requirement already satisfied: pathy>=0.10.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (0.10.3)\n",
      "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (2.0.11)\n",
      "Requirement already satisfied: spacy-loggers<2.0.0,>=1.0.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (1.0.5)\n",
      "Requirement already satisfied: zipp>=0.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from catalogue<2.1.0,>=2.0.6->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (3.15.0)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (2022.12.7)\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (3.4.2)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (2.0.7)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (3.10)\n",
      "Requirement already satisfied: confection<1.0.0,>=0.0.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from thinc<8.2.0,>=8.1.8->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (0.1.5)\n",
      "Requirement already satisfied: blis<0.8.0,>=0.7.8 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from thinc<8.2.0,>=8.1.8->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (0.7.11)\n",
      "Requirement already satisfied: click<9.0.0,>=7.1.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from typer<0.10.0,>=0.3.0->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (8.1.8)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from jinja2->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (2.1.5)\n",
      "Requirement already satisfied: importlib-metadata in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from click<9.0.0,>=7.1.1->typer<0.10.0,>=0.3.0->spacy<3.6.0,>=3.5.0->de-core-news-sm==3.5.0) (6.7.0)\n",
      "Building wheels for collected packages: de-core-news-sm\n",
      "  Building wheel for de-core-news-sm (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for de-core-news-sm: filename=de_core_news_sm-3.5.0-py3-none-any.whl size=14638045 sha256=69dfdde6db10e10c2d2dd18a865373826507104ec972479a3d30f84e443c95d8\n",
      "  Stored in directory: /home/ma-user/.cache/pip/wheels/9d/3d/85/b91be6bde3f0e41d61d410146cb548a92c0b4e0a57d9fd5a03\n",
      "Successfully built de-core-news-sm\n",
      "Installing collected packages: de-core-news-sm\n",
      "Successfully installed de-core-news-sm-3.5.0\n",
      "\u001b[31mERROR: -de_core_news_sm-py3-none-any.whl is not a valid wheel filename.\u001b[0m\u001b[31m\n",
      "\u001b[0mLooking in indexes: http://repo.myhuaweicloud.com/repository/pypi/simple\n",
      "Collecting spacy==3.5\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/47/4f/e7b86df4530798b2679b96e885f015fce7f1bf2a119a64e9399234459fcb/spacy-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.5 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.5/6.5 MB\u001b[0m \u001b[31m79.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hCollecting typer<0.8.0,>=0.3.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/0d/44/56c3f48d2bb83d76f5c970aef8e2c3ebd6a832f09e3621c5395371fe6999/typer-0.7.0-py3-none-any.whl (38 kB)\n",
      "Requirement already satisfied: spacy-loggers<2.0.0,>=1.0.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (1.0.5)\n",
      "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (4.67.1)\n",
      "Requirement already satisfied: wasabi<1.2.0,>=0.9.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (1.1.3)\n",
      "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (2.31.0)\n",
      "Requirement already satisfied: thinc<8.2.0,>=8.1.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (8.1.12)\n",
      "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (2.0.11)\n",
      "Requirement already satisfied: pathy>=0.10.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (0.10.3)\n",
      "Requirement already satisfied: srsly<3.0.0,>=2.4.3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (2.4.8)\n",
      "Requirement already satisfied: packaging>=20.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (24.0)\n",
      "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (3.0.9)\n",
      "Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.11 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (3.0.12)\n",
      "Requirement already satisfied: langcodes<4.0.0,>=3.2.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (3.3.0)\n",
      "Requirement already satisfied: typing-extensions<4.5.0,>=3.7.4.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (4.4.0)\n",
      "Requirement already satisfied: smart-open<7.0.0,>=5.2.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (6.4.0)\n",
      "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (1.0.12)\n",
      "Requirement already satisfied: catalogue<2.1.0,>=2.0.6 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (2.0.10)\n",
      "Requirement already satisfied: numpy>=1.15.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (1.21.6)\n",
      "Requirement already satisfied: setuptools in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (65.6.3)\n",
      "Requirement already satisfied: pydantic!=1.8,!=1.8.1,<1.11.0,>=1.7.4 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (1.10.22)\n",
      "Requirement already satisfied: jinja2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy==3.5) (3.1.6)\n",
      "Requirement already satisfied: zipp>=0.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from catalogue<2.1.0,>=2.0.6->spacy==3.5) (3.15.0)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.5) (2022.12.7)\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.5) (3.4.2)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.5) (2.0.7)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.5) (3.10)\n",
      "Requirement already satisfied: blis<0.8.0,>=0.7.8 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from thinc<8.2.0,>=8.1.0->spacy==3.5) (0.7.11)\n",
      "Requirement already satisfied: confection<1.0.0,>=0.0.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from thinc<8.2.0,>=8.1.0->spacy==3.5) (0.1.5)\n",
      "Requirement already satisfied: click<9.0.0,>=7.1.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from typer<0.8.0,>=0.3.0->spacy==3.5) (8.1.8)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from jinja2->spacy==3.5) (2.1.5)\n",
      "Requirement already satisfied: importlib-metadata in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from click<9.0.0,>=7.1.1->typer<0.8.0,>=0.3.0->spacy==3.5) (6.7.0)\n",
      "Installing collected packages: typer, spacy\n",
      "  Attempting uninstall: typer\n",
      "    Found existing installation: typer 0.9.4\n",
      "    Uninstalling typer-0.9.4:\n",
      "      Successfully uninstalled typer-0.9.4\n",
      "  Attempting uninstall: spacy\n",
      "    Found existing installation: spacy 3.5.4\n",
      "    Uninstalling spacy-3.5.4:\n",
      "      Successfully uninstalled spacy-3.5.4\n",
      "Successfully installed spacy-3.5.0 typer-0.7.0\n",
      "Looking in indexes: http://repo.myhuaweicloud.com/repository/pypi/simple\n",
      "Collecting datasets\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/d3/95/ef83542e7a8e2bfc4432ee2cd8a6b52eb30fb1e605871e8871e94ce65fb1/datasets-2.13.2-py3-none-any.whl (512 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m512.7/512.7 kB\u001b[0m \u001b[31m42.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: requests>=2.19.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from datasets) (2.31.0)\n",
      "Requirement already satisfied: importlib-metadata in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from datasets) (6.7.0)\n",
      "Collecting xxhash\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/21/57/75804858815f1f005dc8f6ca09266c14fbc8ba8ad836a6f8794f180394a0/xxhash-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (194 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.7/194.7 kB\u001b[0m \u001b[31m20.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: numpy>=1.17 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from datasets) (1.21.6)\n",
      "Collecting aiohttp\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/a5/e7/af237a28203958d885f7f57731cb4f9c510597a35c593c5c20224dd72072/aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (987 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m988.0/988.0 kB\u001b[0m \u001b[31m38.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pyarrow>=8.0.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/00/bd/4c03789f723337723670e8cf8935b18e170e7af3813ec38e71d2cfb0bd93/pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (39.1 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m39.1/39.1 MB\u001b[0m \u001b[31m51.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hCollecting huggingface-hub<1.0.0,>=0.11.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/7f/c4/adcbe9a696c135578cabcbdd7331332daad4d49b7c43688bc2d36b3a47d2/huggingface_hub-0.16.4-py3-none-any.whl (268 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m268.8/268.8 kB\u001b[0m \u001b[31m32.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pyyaml>=5.1\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/d7/8f/db62b0df635b9008fe90aa68424e99cee05e68b398740c8a666a98455589/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (670 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m670.1/670.1 kB\u001b[0m \u001b[31m18.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: tqdm>=4.62.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from datasets) (4.67.1)\n",
      "Collecting multiprocess\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/ca/3f/8354ce12fd13bd5c5bb4722261a10ca1d6e2eb7c1c08fa3d8a4e9dc98f44/multiprocess-0.70.15-py37-none-any.whl (116 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m15.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting dill<0.3.7,>=0.3.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/be/e3/a84bf2e561beed15813080d693b4b27573262433fced9c1d1fea59e60553/dill-0.3.6-py3-none-any.whl (110 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.5/110.5 kB\u001b[0m \u001b[31m20.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting pandas\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/3e/0c/23764c4635dcb0a784a787498d56847b90ebf974e65f4ab4053a5d97b1a5/pandas-1.3.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.3 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m11.3/11.3 MB\u001b[0m \u001b[31m74.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: packaging in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from datasets) (24.0)\n",
      "Collecting fsspec[http]>=2021.11.1\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/bd/64/f0d369ede0ca54fdd520bdee5086dbaf0af81dac53a2ce847bd1ec6e0bf1/fsspec-2023.1.0-py3-none-any.whl (143 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m143.0/143.0 kB\u001b[0m \u001b[31m13.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting attrs>=17.3.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl (63 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m63.0/63.0 kB\u001b[0m \u001b[31m9.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting yarl<2.0,>=1.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/45/33/d958b3f31420ccc99075e9355d9cb27b0c39d712dbcb0a6cda408c1aa6c4/yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (289 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m289.8/289.8 kB\u001b[0m \u001b[31m15.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting asynctest==0.13.0\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/e8/b6/8d17e169d577ca7678b11cd0d3ceebb0a6089a7f4a2de4b945fe4b1c86db/asynctest-0.13.0-py3-none-any.whl (26 kB)\n",
      "Collecting async-timeout<5.0,>=4.0.0a3\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl (5.7 kB)\n",
      "Requirement already satisfied: typing-extensions>=3.7.4 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets) (4.4.0)\n",
      "Collecting frozenlist>=1.1.1\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/b2/18/3b0eb2690b3bf4d340a221d0e76b6c5f4cac9d5dd37fb8c7b6ec25c2f510/frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (148 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m148.0/148.0 kB\u001b[0m \u001b[31m12.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hCollecting aiosignal>=1.1.2\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n",
      "Collecting multidict<7.0,>=4.5\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/0a/f0/b256648385dfda067688570b10e7b90eacd3711c26635763560cbad0a447/multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (99 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m99.8/99.8 kB\u001b[0m \u001b[31m13.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: charset-normalizer<4.0,>=2.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets) (3.4.2)\n",
      "Collecting filelock\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/00/45/ec3407adf6f6b5bf867a4462b2b0af27597a26bd3cd6e2534cb6ab029938/filelock-3.12.2-py3-none-any.whl (10 kB)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests>=2.19.0->datasets) (2.0.7)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests>=2.19.0->datasets) (3.10)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests>=2.19.0->datasets) (2022.12.7)\n",
      "Requirement already satisfied: zipp>=0.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from importlib-metadata->datasets) (3.15.0)\n",
      "Collecting multiprocess\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/f1/00/c1b90843cb80e6a1911f480e92a92b1258efcdd32ed4fe87449703416fc4/multiprocess-0.70.14-py37-none-any.whl (115 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m115.7/115.7 kB\u001b[0m \u001b[31m19.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: python-dateutil>=2.7.3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from pandas->datasets) (2.9.0.post0)\n",
      "Collecting pytz>=2017.3\n",
      "  Using cached http://repo.myhuaweicloud.com/repository/pypi/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl (509 kB)\n",
      "Requirement already satisfied: six>=1.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from python-dateutil>=2.7.3->pandas->datasets) (1.17.0)\n",
      "Installing collected packages: pytz, xxhash, pyyaml, pyarrow, multidict, fsspec, frozenlist, filelock, dill, asynctest, async-timeout, yarl, pandas, multiprocess, huggingface-hub, attrs, aiosignal, aiohttp, datasets\n",
      "Successfully installed aiohttp-3.8.6 aiosignal-1.3.1 async-timeout-4.0.3 asynctest-0.13.0 attrs-24.2.0 datasets-2.13.2 dill-0.3.6 filelock-3.12.2 frozenlist-1.3.3 fsspec-2023.1.0 huggingface-hub-0.16.4 multidict-6.0.5 multiprocess-0.70.14 pandas-1.3.5 pyarrow-12.0.1 pytz-2025.2 pyyaml-6.0.1 xxhash-3.5.0 yarl-1.9.4\n",
      "Looking in indexes: http://repo.myhuaweicloud.com/repository/pypi/simple\n",
      "Collecting evaluate\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/70/63/7644a1eb7b0297e585a6adec98ed9e575309bb973c33b394dae66bc35c69/evaluate-0.4.1-py3-none-any.whl (84 kB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m84.1/84.1 kB\u001b[0m \u001b[31m11.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25hRequirement already satisfied: requests>=2.19.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (2.31.0)\n",
      "Requirement already satisfied: packaging in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (24.0)\n",
      "Requirement already satisfied: importlib-metadata in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (6.7.0)\n",
      "Requirement already satisfied: datasets>=2.0.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (2.13.2)\n",
      "Requirement already satisfied: fsspec[http]>=2021.05.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (2023.1.0)\n",
      "Requirement already satisfied: dill in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (0.3.6)\n",
      "Requirement already satisfied: tqdm>=4.62.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (4.67.1)\n",
      "Requirement already satisfied: huggingface-hub>=0.7.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (0.16.4)\n",
      "Requirement already satisfied: multiprocess in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (0.70.14)\n",
      "Requirement already satisfied: xxhash in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (3.5.0)\n",
      "Collecting responses<0.19\n",
      "  Downloading http://repo.myhuaweicloud.com/repository/pypi/packages/79/f3/2b3a6dc5986303b3dd1bbbcf482022acb2583c428cd23f0b6d37b1a1a519/responses-0.18.0-py3-none-any.whl (38 kB)\n",
      "Requirement already satisfied: pandas in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (1.3.5)\n",
      "Requirement already satisfied: numpy>=1.17 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from evaluate) (1.21.6)\n",
      "Requirement already satisfied: aiohttp in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from datasets>=2.0.0->evaluate) (3.8.6)\n",
      "Requirement already satisfied: pyyaml>=5.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from datasets>=2.0.0->evaluate) (6.0.1)\n",
      "Requirement already satisfied: pyarrow>=8.0.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from datasets>=2.0.0->evaluate) (12.0.1)\n",
      "Requirement already satisfied: typing-extensions>=3.7.4.3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from huggingface-hub>=0.7.0->evaluate) (4.4.0)\n",
      "Requirement already satisfied: filelock in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from huggingface-hub>=0.7.0->evaluate) (3.12.2)\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests>=2.19.0->evaluate) (3.4.2)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests>=2.19.0->evaluate) (3.10)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests>=2.19.0->evaluate) (2.0.7)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests>=2.19.0->evaluate) (2022.12.7)\n",
      "Requirement already satisfied: zipp>=0.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from importlib-metadata->evaluate) (3.15.0)\n",
      "Requirement already satisfied: pytz>=2017.3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from pandas->evaluate) (2025.2)\n",
      "Requirement already satisfied: python-dateutil>=2.7.3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from pandas->evaluate) (2.9.0.post0)\n",
      "Requirement already satisfied: attrs>=17.3.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets>=2.0.0->evaluate) (24.2.0)\n",
      "Requirement already satisfied: yarl<2.0,>=1.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets>=2.0.0->evaluate) (1.9.4)\n",
      "Requirement already satisfied: asynctest==0.13.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets>=2.0.0->evaluate) (0.13.0)\n",
      "Requirement already satisfied: frozenlist>=1.1.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets>=2.0.0->evaluate) (1.3.3)\n",
      "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets>=2.0.0->evaluate) (4.0.3)\n",
      "Requirement already satisfied: aiosignal>=1.1.2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets>=2.0.0->evaluate) (1.3.1)\n",
      "Requirement already satisfied: multidict<7.0,>=4.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from aiohttp->datasets>=2.0.0->evaluate) (6.0.5)\n",
      "Requirement already satisfied: six>=1.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from python-dateutil>=2.7.3->pandas->evaluate) (1.17.0)\n",
      "Installing collected packages: responses, evaluate\n",
      "Successfully installed evaluate-0.4.1 responses-0.18.0\n",
      "Looking in indexes: http://repo.myhuaweicloud.com/repository/pypi/simple\n",
      "Requirement already satisfied: en_core_web_sm in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (3.5.0)\n",
      "Requirement already satisfied: spacy<3.6.0,>=3.5.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from en_core_web_sm) (3.5.0)\n",
      "Requirement already satisfied: typer<0.8.0,>=0.3.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (0.7.0)\n",
      "Requirement already satisfied: numpy>=1.15.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (1.21.6)\n",
      "Requirement already satisfied: langcodes<4.0.0,>=3.2.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (3.3.0)\n",
      "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (2.31.0)\n",
      "Requirement already satisfied: catalogue<2.1.0,>=2.0.6 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (2.0.10)\n",
      "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (2.0.11)\n",
      "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (1.0.12)\n",
      "Requirement already satisfied: spacy-loggers<2.0.0,>=1.0.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (1.0.5)\n",
      "Requirement already satisfied: thinc<8.2.0,>=8.1.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (8.1.12)\n",
      "Requirement already satisfied: packaging>=20.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (24.0)\n",
      "Requirement already satisfied: wasabi<1.2.0,>=0.9.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (1.1.3)\n",
      "Requirement already satisfied: pathy>=0.10.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (0.10.3)\n",
      "Requirement already satisfied: smart-open<7.0.0,>=5.2.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (6.4.0)\n",
      "Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.11 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (3.0.12)\n",
      "Requirement already satisfied: srsly<3.0.0,>=2.4.3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (2.4.8)\n",
      "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (4.67.1)\n",
      "Requirement already satisfied: jinja2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (3.1.6)\n",
      "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (3.0.9)\n",
      "Requirement already satisfied: pydantic!=1.8,!=1.8.1,<1.11.0,>=1.7.4 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (1.10.22)\n",
      "Requirement already satisfied: setuptools in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (65.6.3)\n",
      "Requirement already satisfied: typing-extensions<4.5.0,>=3.7.4.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from spacy<3.6.0,>=3.5.0->en_core_web_sm) (4.4.0)\n",
      "Requirement already satisfied: zipp>=0.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from catalogue<2.1.0,>=2.0.6->spacy<3.6.0,>=3.5.0->en_core_web_sm) (3.15.0)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->en_core_web_sm) (2022.12.7)\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->en_core_web_sm) (3.4.2)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->en_core_web_sm) (3.10)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.6.0,>=3.5.0->en_core_web_sm) (2.0.7)\n",
      "Requirement already satisfied: blis<0.8.0,>=0.7.8 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from thinc<8.2.0,>=8.1.0->spacy<3.6.0,>=3.5.0->en_core_web_sm) (0.7.11)\n",
      "Requirement already satisfied: confection<1.0.0,>=0.0.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from thinc<8.2.0,>=8.1.0->spacy<3.6.0,>=3.5.0->en_core_web_sm) (0.1.5)\n",
      "Requirement already satisfied: click<9.0.0,>=7.1.1 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from typer<0.8.0,>=0.3.0->spacy<3.6.0,>=3.5.0->en_core_web_sm) (8.1.8)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from jinja2->spacy<3.6.0,>=3.5.0->en_core_web_sm) (2.1.5)\n",
      "Requirement already satisfied: importlib-metadata in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from click<9.0.0,>=7.1.1->typer<0.8.0,>=0.3.0->spacy<3.6.0,>=3.5.0->en_core_web_sm) (6.7.0)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    }
   ],
   "source": [
    "!pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.5.0/en_core_web_sm-3.5.0.tar.gz\n",
    "!pip install https://github.com/explosion/spacy-models/releases/download/de_core_news_sm-3.5.0/de_core_news_sm-3.5.0.tar.gz\n",
    "!python -m spacy download de_core_news_sm --direct\n",
    "!pip install spacy==3.5\n",
    "!pip install datasets\n",
    "!pip install evaluate\n",
    "!pip install en_core_web_sm\n",
    "import mindspore as ms\n",
    "import mindspore.context as context\n",
    "import mindspore.nn as nn\n",
    "import mindspore.ops as ops\n",
    "\n",
    "import random\n",
    "import numpy as np\n",
    "import spacy\n",
    "import datasets\n",
    "import evaluate\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "设置随机数种子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "seed = 1234\n",
    "\n",
    "random.seed(seed)\n",
    "np.random.seed(seed)\n",
    "ms.set_seed(seed)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "加载数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading and preparing dataset json/dataset to /home/ma-user/.cache/huggingface/datasets/json/dataset-8cfa162c84805a1e/0.0.0/8bb11242116d547c741b2e8a1f18598ffdd40a1d4f2a2872c7a28b697434bc96...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Downloading data files: 100%|██████████| 3/3 [00:00<00:00, 4802.64it/s]\n",
      "Extracting data files: 100%|██████████| 3/3 [00:00<00:00, 334.15it/s]\n",
      "                                                        \r"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset json downloaded and prepared to /home/ma-user/.cache/huggingface/datasets/json/dataset-8cfa162c84805a1e/0.0.0/8bb11242116d547c741b2e8a1f18598ffdd40a1d4f2a2872c7a28b697434bc96. Subsequent calls will reuse this data.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 3/3 [00:00<00:00, 673.35it/s]\n"
     ]
    }
   ],
   "source": [
    "dataset = datasets.load_dataset(\"./dataset\",data_files={\n",
    "    \"train\":\"train.jsonl\",\n",
    "    \"val\":\"val.jsonl\",\n",
    "    \"test\":\"test.jsonl\"\n",
    "}\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data, valid_data, test_data = dataset[\"train\"], dataset[\"val\"], dataset[\"test\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "en_nlp = spacy.load(\"en_core_web_sm\")\n",
    "de_nlp = spacy.load(\"de_core_news_sm\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def tokenize_example(\n",
    "    example,\n",
    "    en_nlp,\n",
    "    de_nlp,\n",
    "    max_length,\n",
    "    lower,\n",
    "    sos_token,\n",
    "    eos_token\n",
    "):\n",
    "    en_tokens = [token.text for token in en_nlp.tokenizer(example[\"en\"])][:max_length]\n",
    "    de_tokens = [token.text for token in de_nlp.tokenizer(example[\"de\"])][:max_length]\n",
    "    if lower:\n",
    "        en_tokens = [token.lower() for token in en_tokens]\n",
    "        de_tokens = [token.lower() for token in de_tokens]\n",
    "    en_tokens = [sos_token] + en_tokens + [eos_token]\n",
    "    de_tokens = [sos_token] + de_tokens + [eos_token]\n",
    "    return {\"en_tokens\": en_tokens, \"de_tokens\": de_tokens}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                   \r"
     ]
    }
   ],
   "source": [
    "max_length = 1_000\n",
    "lower = True\n",
    "sos_token = \"<sos>\"\n",
    "eos_token = \"<eos>\"\n",
    "\n",
    "fn_kwargs = {\n",
    "    \"en_nlp\": en_nlp, \n",
    "    \"de_nlp\": de_nlp, \n",
    "    \"max_length\": max_length,\n",
    "    \"lower\": lower,\n",
    "    \"sos_token\": sos_token,\n",
    "    \"eos_token\": eos_token,\n",
    "}\n",
    "\n",
    "\n",
    "train_data = train_data.map(tokenize_example, fn_kwargs=fn_kwargs)\n",
    "valid_data = valid_data.map(tokenize_example, fn_kwargs=fn_kwargs)\n",
    "test_data = test_data.map(tokenize_example, fn_kwargs=fn_kwargs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import collections\n",
    "class Vocab:\n",
    "    \"\"\"一个词汇表的实现\"\"\"\n",
    "    def __init__(self, tokens:list, min_freq=0, reserved_tokens:list=None) -> None:\n",
    "        self.default_index = None\n",
    "        if tokens is not None:\n",
    "            # 当第一个条件满足时，就不会跳到第二个判断，避免了空列表报错的情况。\n",
    "            if len(tokens)!=0 and isinstance(tokens[0], list):\n",
    "                tokens = [i for line in tokens for i in line]\n",
    "        else:\n",
    "            tokens = []\n",
    "        if reserved_tokens is None:\n",
    "            reserved_tokens = []\n",
    "        counter=collections.Counter(tokens)\n",
    "        # 按出现词频从高到低排序\n",
    "        self._token_freqs = sorted(counter.items(), key=lambda x:x[1], reverse=True)\n",
    "        # 通过列表,利用序号访问词元。\n",
    "        self.idx_to_token = [] + reserved_tokens # 未知词元<unk>的索引为0, 保留词元排在最前\n",
    "        self.token_to_idx = {\n",
    "            i: k\n",
    "            for k, i in enumerate(self.idx_to_token) \n",
    "        }\n",
    "        \n",
    "        for token, freq in self._token_freqs:\n",
    "            if freq < min_freq:  # 过滤掉出现频率低于要求的词\n",
    "                break\n",
    "            if token not in self.token_to_idx:  \n",
    "                self.idx_to_token.append(token)\n",
    "                self.token_to_idx[token] = len(self.idx_to_token) - 1\n",
    "        \n",
    "    def __len__(self):\n",
    "        return len(self.idx_to_token)\n",
    "    \n",
    "    def __getitem__(self, input_tokens):\n",
    "        \"\"\"输入单字串或序列, 将其全部转化为序号编码\"\"\"\n",
    "        if isinstance(input_tokens, str):\n",
    "            out =  self.token_to_idx.get(input_tokens, self.default_index)\n",
    "            if out is None:\n",
    "                raise Exception('Please call \"set_default_index\" before getting unknown index')\n",
    "            return out\n",
    "        return [self.__getitem__(token) for token in input_tokens]\n",
    "    \n",
    "    def __repr__(self) -> str:\n",
    "        show_items = 5 if len(self) > 5 else len(self)\n",
    "        out = f\"<Vocab with {len(self)} tokens: \"\n",
    "        for i in range(show_items):\n",
    "            out += f'\"{self.idx_to_token[i]}\", '\n",
    "        out += \"...>\"\n",
    "        return out\n",
    "\n",
    "    def __contains__(self, token:str) -> bool:\n",
    "        return token in self.idx_to_token\n",
    "\n",
    "    def to_tokens(self, input_keys):\n",
    "        \"\"\"输入单s索引或序列, 将其全部转化为词元\"\"\"\n",
    "        if isinstance(input_keys, int):\n",
    "            return self.idx_to_token[input_keys] if input_keys < len(self) else self.idx_to_token[0]\n",
    "        elif isinstance(input_keys, (list, tuple)):\n",
    "            return [self.to_tokens(keys) for keys in input_keys]\n",
    "        else:\n",
    "            return self.idx_to_token[0]\n",
    "    \n",
    "    def get_itos(self):\n",
    "        return self.idx_to_token\n",
    "    \n",
    "    def get_stoi(self):\n",
    "        return self.token_to_idx\n",
    "    \n",
    "    def set_default_index(self, idx):\n",
    "        if isinstance(idx, int):\n",
    "            self.default_index = idx\n",
    "        else:\n",
    "            raise Exception(f\"Only type int allowed, got {type(idx)}\")\n",
    "\n",
    "    def lookup_indices(self, input_tokens):\n",
    "        return self.__getitem__(input_tokens)\n",
    "    \n",
    "    def lookup_tokens(self, idx):\n",
    "        return self.to_tokens(idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "min_freq = 2\n",
    "unk_token = \"<unk>\"\n",
    "pad_token = \"<pad>\"\n",
    "\n",
    "special_tokens = [\n",
    "    unk_token,\n",
    "    pad_token,\n",
    "    sos_token,\n",
    "    eos_token,\n",
    "]\n",
    "\n",
    "def build_vocab_from_iterator(tokens, min_freq, specials):\n",
    "    return Vocab(tokens, min_freq, specials)\n",
    "\n",
    "en_vocab = build_vocab_from_iterator(\n",
    "    train_data[\"en_tokens\"],\n",
    "    min_freq=min_freq,\n",
    "    specials=special_tokens,\n",
    ")\n",
    "\n",
    "de_vocab = build_vocab_from_iterator(\n",
    "    train_data[\"de_tokens\"],\n",
    "    min_freq=min_freq,\n",
    "    specials=special_tokens,  \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "assert en_vocab[unk_token] == de_vocab[unk_token]\n",
    "assert en_vocab[pad_token] == de_vocab[pad_token]\n",
    "\n",
    "unk_index = en_vocab[unk_token]\n",
    "pad_index = en_vocab[pad_token]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "en_vocab.set_default_index(unk_index)\n",
    "de_vocab.set_default_index(unk_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def numericalize_example(example, en_vocab, de_vocab):\n",
    "    en_ids = en_vocab.lookup_indices(example[\"en_tokens\"])\n",
    "    de_ids = de_vocab.lookup_indices(example[\"de_tokens\"])\n",
    "    return {\"en_ids\": en_ids, \"de_ids\": de_ids}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                   \r"
     ]
    }
   ],
   "source": [
    "fn_kwargs = {\n",
    "    \"en_vocab\": en_vocab, \n",
    "    \"de_vocab\": de_vocab\n",
    "}\n",
    "\n",
    "train_data = train_data.map(numericalize_example, fn_kwargs=fn_kwargs)\n",
    "valid_data = valid_data.map(numericalize_example, fn_kwargs=fn_kwargs)\n",
    "test_data = test_data.map(numericalize_example, fn_kwargs=fn_kwargs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_type = \"numpy\"\n",
    "format_columns = [\"en_ids\", \"de_ids\"]\n",
    "\n",
    "train_data = train_data.with_format(\n",
    "    type=data_type, \n",
    "    columns=format_columns, \n",
    "    output_all_columns=True\n",
    ")\n",
    "\n",
    "valid_data = valid_data.with_format(\n",
    "    type=data_type, \n",
    "    columns=format_columns, \n",
    "    output_all_columns=True,\n",
    ")\n",
    "\n",
    "test_data = test_data.with_format(\n",
    "    type=data_type, \n",
    "    columns=format_columns, \n",
    "    output_all_columns=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def pad_sequence(sequences:list, padding_value:int):\n",
    "    '''将序列填充到等长并返回mindspore张量'''\n",
    "    # Find the length of the longest sequence in the batch\n",
    "    max_length = max(len(seq) for seq in sequences)\n",
    "    padded_sequences:ms.Tensor = ops.full((len(sequences), max_length), padding_value, dtype=ms.int64)\n",
    "    # Copy the sequences into the padded array\n",
    "    for i, seq in enumerate(sequences):\n",
    "        padded_sequences[i, :len(seq)] = ms.tensor(seq).astype(np.int64)\n",
    "    # 换轴，保证输出为时序优先\n",
    "    padded_sequences = padded_sequences.swapaxes(0, 1)\n",
    "    return padded_sequences  \n",
    "\n",
    "def get_collate_fn(pad_index):\n",
    "    \n",
    "    def collate_fn(batch):\n",
    "        batch_en_ids = [example[\"en_ids\"] for example in batch]\n",
    "        batch_de_ids = [example[\"de_ids\"] for example in batch]\n",
    "        batch_en_ids = pad_sequence(batch_en_ids, padding_value=pad_index)\n",
    "        batch_de_ids = pad_sequence(batch_de_ids, padding_value=pad_index)\n",
    "        batch = {\n",
    "            \"en_ids\": batch_en_ids,\n",
    "            \"de_ids\": batch_de_ids,\n",
    "        }\n",
    "        return batch\n",
    "    \n",
    "    return collate_fn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DataLoader:\n",
    "    def __init__(self, source, batch_size, shuffle=False, per_batch_map=None):\n",
    "        self.source = source\n",
    "        self.batch_size = batch_size\n",
    "        self.shuffle = shuffle\n",
    "        self.per_batch_map = per_batch_map\n",
    "        self.indices = np.arange(len(source))\n",
    "        self.current_index = 0\n",
    "\n",
    "        if self.shuffle:\n",
    "            np.random.shuffle(self.indices)\n",
    "\n",
    "    def __iter__(self):\n",
    "        return self\n",
    "\n",
    "    def __next__(self):\n",
    "        if self.current_index >= len(self.source):\n",
    "            self.current_index = 0\n",
    "            raise StopIteration\n",
    "\n",
    "        batch_indices = self.indices[self.current_index:self.current_index + self.batch_size]\n",
    "        batch_data = [self.source[int(i)] for i in batch_indices]\n",
    "\n",
    "        if self.per_batch_map:\n",
    "            batch_data = self.per_batch_map(batch_data)\n",
    "\n",
    "        self.current_index += self.batch_size\n",
    "        return batch_data\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.source) // self.batch_size\n",
    "\n",
    "\n",
    "def get_data_loader(dataset, batch_size, pad_index, shuffle=False):\n",
    "    collate_fn = get_collate_fn(pad_index)\n",
    "    dataloader = DataLoader(dataset, batch_size, shuffle=shuffle, per_batch_map=collate_fn)\n",
    "    \n",
    "    return dataloader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 128\n",
    "\n",
    "train_data_loader = get_data_loader(train_data, batch_size, pad_index, shuffle=True)\n",
    "valid_data_loader = get_data_loader(valid_data, batch_size, pad_index)\n",
    "test_data_loader = get_data_loader(test_data, batch_size, pad_index)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建Seq2Seq模型\n",
    "\n",
    "### 编码器\n",
    "\n",
    "首先，我们将构建编码器。与之前的模型类似，我们仅使用一个单层GRU，但现在我们使用了*双向RNN*。在双向RNN中，每一层都有两个RNN。一个*RNN向前*从左到右遍历嵌入的句子（下图中为绿色），一个*RNN向后*从右到左遍历嵌入的句子（青色）。在代码中，我们只需设置 `bidirectional = True`，然后像以前一样将嵌入的句子传递给RNN。\n",
    "\n",
    "![](assets/seq2seq8.png)\n",
    "\n",
    "现在我们有：\n",
    "\n",
    "$$\\begin{align*}\n",
    "h_t^\\rightarrow &= \\text{EncoderGRU}^\\rightarrow(e(x_t^\\rightarrow),h_{t-1}^\\rightarrow)\\\\\n",
    "h_t^\\leftarrow &= \\text{EncoderGRU}^\\leftarrow(e(x_t^\\leftarrow),h_{t-1}^\\leftarrow)\n",
    "\\end{align*}$$\n",
    "\n",
    "其中 $x_0^\\rightarrow = \\text{<sos>}, x_1^\\rightarrow = \\text{guten}$ 和 $x_0^\\leftarrow = \\text{<eos>}, x_1^\\leftarrow = \\text{morgen}$。\n",
    "\n",
    "与之前一样，我们只将输入 (`embedded`) 传递给RNN，告诉Mindspore将前向和后向初始隐藏状态（分别为 $h_0^\\rightarrow$ 和 $h_0^\\leftarrow$）初始化为全零张量。我们还会得到两个上下文向量，一个来自前向RNN在看到句子的最后一个词后，$z^\\rightarrow=h_T^\\rightarrow$，一个来自后向RNN在看到句子的第一个词后，$z^\\leftarrow=h_T^\\leftarrow$。\n",
    "\n",
    "RNN返回 `outputs` 和 `hidden`。\n",
    "\n",
    "`outputs` 的大小为 **[src len, batch size, hid dim * num directions]**，其中第三轴的前 `hid_dim` 元素是从顶层前向RNN获得的隐藏状态，最后的 `hid_dim` 元素是从顶层后向RNN获得的隐藏状态。我们可以将第三轴视为前向和后向隐藏状态在一起连接的地方，即 $h_1 = [h_1^\\rightarrow; h_{T}^\\leftarrow]$，$h_2 = [h_2^\\rightarrow; h_{T-1}^\\leftarrow]$，我们可以将所有编码器隐藏状态（前向和后向连接在一起）表示为 $H=\\{ h_1, h_2, ..., h_T\\}$。\n",
    "\n",
    "`hidden` 的大小为 **[n layers * num directions, batch size, hid dim]**，其中 **[-2, :, :]** 给出了顶层前向RNN在最后一个时间步（即在看到句子的最后一个词后）之后的隐藏状态，**[-1, :, :]** 给出了顶层后向RNN在最后一个时间步（即在看到句子的第一个词后）之后的隐藏状态。\n",
    "\n",
    "由于解码器不是双向的，它只需要一个上下文向量 $z$ 用作初始隐藏状态 $s_0$，而我们目前有两个，一个前向的和一个后向的（$z^\\rightarrow=h_T^\\rightarrow$ 和 $z^\\leftarrow=h_T^\\leftarrow$）。我们通过将两个上下文向量连接在一起，将它们传递给一个线性层 $g$ 并应用 $\\tanh$ 激活函数来解决这个问题。\n",
    "\n",
    "$$z=\\tanh(g(h_T^\\rightarrow, h_T^\\leftarrow)) = \\tanh(g(z^\\rightarrow, z^\\leftarrow)) = s_0$$\n",
    "\n",
    "**注意**：这实际上是与论文中的方法有所不同。在论文中，他们仅通过线性层传递第一个后向RNN隐藏状态以获得上下文向量/解码器初始隐藏状态。这对我来说看起来不合理，所以我们进行了修改。\n",
    "\n",
    "由于我们希望我们的模型能够查看整个源句子，我们返回 `outputs`，即源句子中每个标记的堆叠的前向和后向隐藏状态。我们还返回 `hidden`，它充当解码器中的初始隐藏状态。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Encoder(nn.Cell):\n",
    "    def __init__(self, input_dim, emb_dim, enc_hid_dim, dec_hid_dim, dropout):\n",
    "        super().__init__()\n",
    "        \n",
    "        self.embedding = nn.Embedding(input_dim, emb_dim)\n",
    "        self.rnn = nn.GRU(emb_dim, enc_hid_dim, bidirectional = True)\n",
    "        self.fc = nn.Dense(enc_hid_dim * 2, dec_hid_dim)\n",
    "        self.dropout = nn.Dropout(p=dropout)\n",
    "        \n",
    "    def construct(self, src):\n",
    "        \n",
    "        #src = [src len, batch size]\n",
    "        \n",
    "        embedded = self.dropout(self.embedding(src))\n",
    "        \n",
    "        #embedded = [src len, batch size, emb dim]\n",
    "        \n",
    "        outputs, hidden = self.rnn(embedded)\n",
    "                \n",
    "        #outputs = [src len, batch size, hid dim * num directions]\n",
    "        #hidden = [n layers * num directions, batch size, hid dim]\n",
    "        \n",
    "        #hidden is stacked [forward_1, backward_1, forward_2, backward_2, ...]\n",
    "        #outputs are always from the last layer\n",
    "        \n",
    "        #hidden [-2, :, : ] is the last of the forwards RNN \n",
    "        #hidden [-1, :, : ] is the last of the backwards RNN\n",
    "        \n",
    "        #initial decoder hidden is final hidden state of the forwards and backwards \n",
    "        #  encoder RNNs fed through a linear layer\n",
    "        hidden = ops.tanh(self.fc(ops.cat((hidden[-2,:,:], hidden[-1,:,:]), axis=1)))\n",
    "        \n",
    "        #outputs = [src len, batch size, enc hid dim * 2]\n",
    "        #hidden = [batch size, dec hid dim]\n",
    "        \n",
    "        return outputs, hidden"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Attention\n",
    "\n",
    "接下来是注意力层。它将接收到解码器的前一个隐藏状态 $s_{t-1}$ 和编码器的所有堆叠的前向和后向隐藏状态 $H$。该层将输出一个注意力向量 $a_t$，其长度为源句子的长度，其中每个元素在 0 和 1 之间，整个向量的和为 1。\n",
    "\n",
    "直观地说，该层利用我们到目前为止已解码的内容 $s_{t-1}$ 和我们已编码的所有内容 $H$ 来生成一个向量 $a_t$，该向量表示为了正确预测下一个要解码的单词 $\\hat{y}_{t+1}$，我们应该最关注源句子中的哪些单词。\n",
    "\n",
    "首先，我们计算前一个解码器隐藏状态和编码器隐藏状态之间的 *能量*。由于我们的编码器隐藏状态是 $T$ 个张量的序列，而我们的前一个解码器隐藏状态是单个张量，我们首先使用 `repeat` 将前一个解码器隐藏状态重复 $T$ 次。然后，通过将它们连接在一起并通过一个线性层 (`attn`) 和一个 $\\tanh$ 激活函数，计算它们之间的能量 $E_t$。\n",
    "\n",
    "$$E_t = \\tanh(\\text{attn}(s_{t-1}, H))$$\n",
    "\n",
    "这可以看作是计算每个编码器隐藏状态与前一个解码器隐藏状态的 \"匹配程度\"。\n",
    "\n",
    "我们目前对于批处理中的每个示例都有一个 **[dec hid dim, src len]** 张量。我们希望对于批处理中的每个示例，这个张量都是 **[src len]**，因为注意力应该覆盖源句子的长度。这通过将 `energy` 乘以 **[1, dec hid dim]** 张量 $v$ 来实现。\n",
    "\n",
    "$$\\hat{a}_t = v E_t$$\n",
    "\n",
    "我们可以将 $v$ 视为加权求和的权重，这个权重遍历所有编码器隐藏状态的能量。这些权重告诉我们在源序列中应该注意每个标记的程度。 $v$ 的参数是随机初始化的，但会随着模型的其余部分一起通过反向传播进行学习。请注意，$v$ 不依赖于时间，并且在解码的每个时间步骤中都使用相同的 $v$。我们将 $v$ 实现为一个没有偏差的线性层。\n",
    "\n",
    "最后，通过通过一个 $\\text{softmax}$ 层，我们确保注意力向量符合所有元素都在 0 和 1 之间且向量总和为 1 的约束。\n",
    "\n",
    "$$a_t = \\text{softmax}(\\hat{a_t})$$\n",
    "\n",
    "这给我们提供了源句子上的注意力！\n",
    "\n",
    "从图形上看，如下所示。这是用于计算第一个注意力向量的情况，其中 $s_{t-1} = s_0 = z$。绿色/青色块表示前向和后向RNN的隐藏状态，注意力计算完全在粉色块内完成。\n",
    "\n",
    "![](assets/seq2seq9.png)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Attention(nn.Cell):\n",
    "    def __init__(self, enc_hid_dim, dec_hid_dim):\n",
    "        super().__init__()\n",
    "        \n",
    "        self.attn = nn.Dense((enc_hid_dim * 2) + dec_hid_dim, dec_hid_dim)\n",
    "        self.v = nn.Dense(dec_hid_dim, 1, has_bias = False)\n",
    "        \n",
    "    def construct(self, hidden:ms.Tensor, encoder_outputs:ms.Tensor):\n",
    "        \n",
    "        #hidden = [batch size, dec hid dim]\n",
    "        #encoder_outputs = [src len, batch size, enc hid dim * 2]\n",
    "        \n",
    "        batch_size = encoder_outputs.shape[1]\n",
    "        src_len = encoder_outputs.shape[0]\n",
    "        \n",
    "        #repeat decoder hidden state src_len times\n",
    "        hidden = hidden.unsqueeze(1).tile((1, src_len, 1))\n",
    "        \n",
    "        encoder_outputs = encoder_outputs.permute(1, 0, 2)\n",
    "        \n",
    "        #hidden = [batch size, src len, dec hid dim]\n",
    "        #encoder_outputs = [batch size, src len, enc hid dim * 2]\n",
    "        \n",
    "        energy = ops.tanh(self.attn(ops.cat((hidden, encoder_outputs), axis = 2))) \n",
    "        \n",
    "        #energy = [batch size, src len, dec hid dim]\n",
    "\n",
    "        attention = self.v(energy).squeeze(2)\n",
    "        \n",
    "        #attention= [batch size, src len]\n",
    "        \n",
    "        return ops.softmax(attention, axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Decoder\n",
    "\n",
    "接下来是解码器。\n",
    "\n",
    "解码器包含注意力层 `attention`，该层接收前一个隐藏状态 $s_{t-1}$，所有编码器隐藏状态 $H$，并返回注意力向量 $a_t$。\n",
    "\n",
    "然后，我们使用这个注意力向量来创建加权源向量 $w_t$，表示为 `weighted`，它是使用 $a_t$ 作为权重对编码器隐藏状态 $H$ 进行加权求和。\n",
    "\n",
    "$$w_t = a_t H$$\n",
    "\n",
    "嵌入的输入单词 $d(y_t)$、加权源向量 $w_t$ 和前一个解码器隐藏状态 $s_{t-1}$ 随后都传入解码器 RNN，其中 $d(y_t)$ 和 $w_t$ 被连接在一起。\n",
    "\n",
    "$$s_t = \\text{DecoderGRU}(d(y_t), w_t, s_{t-1})$$\n",
    "\n",
    "然后，我们通过线性层 $f$ 传递 $d(y_t)$、$w_t$ 和 $s_t$，以预测目标句子中的下一个单词 $\\hat{y}_{t+1}$。这通过将它们全部连接在一起来实现。\n",
    "\n",
    "$$\\hat{y}_{t+1} = f(d(y_t), w_t, s_t)$$\n",
    "\n",
    "下图显示了对示例翻译中的第一个单词进行解码。\n",
    "\n",
    "![](assets/seq2seq10.png)\n",
    "\n",
    "绿色/青色块显示了前向/后向编码器RNN，其输出为 $H$；红色块显示了上下文向量 $z = h_T = \\tanh(g(h^\\rightarrow_T,h^\\leftarrow_T)) = \\tanh(g(z^\\rightarrow, z^\\leftarrow)) = s_0$；蓝色块显示了解码器RNN，其输出为 $s_t$；紫色块显示了线性层 $f$，其输出为 $\\hat{y}_{t+1}$；橙色块显示了通过 $a_t$ 对 $H$ 进行加权求和的计算，并输出 $w_t$。没有显示 $a_t$ 的计算。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Decoder(nn.Cell):\n",
    "    def __init__(self, output_dim:int, emb_dim:int, enc_hid_dim:int, dec_hid_dim:int, dropout, attention:Attention):\n",
    "        super().__init__()\n",
    "\n",
    "        self.output_dim = output_dim\n",
    "        self.attention = attention\n",
    "        \n",
    "        self.embedding = nn.Embedding(output_dim, emb_dim)\n",
    "        \n",
    "        self.rnn = nn.GRU((enc_hid_dim * 2) + emb_dim, dec_hid_dim)\n",
    "        \n",
    "        self.fc_out = nn.Dense((enc_hid_dim * 2) + dec_hid_dim + emb_dim, output_dim)\n",
    "        \n",
    "        self.dropout = nn.Dropout(p=dropout)\n",
    "        \n",
    "    def construct(self, input:ms.Tensor, hidden:ms.Tensor, encoder_outputs:ms.Tensor):\n",
    "             \n",
    "        #input = [batch size]\n",
    "        #hidden = [batch size, dec hid dim]\n",
    "        #encoder_outputs = [src len, batch size, enc hid dim * 2]\n",
    "        \n",
    "        input = input.unsqueeze(0)\n",
    "        \n",
    "        #input = [1, batch size]\n",
    "        \n",
    "        embedded = self.dropout(self.embedding(input))\n",
    "        \n",
    "        #embedded = [1, batch size, emb dim]\n",
    "        \n",
    "        a = self.attention(hidden, encoder_outputs)\n",
    "                \n",
    "        #a = [batch size, src len]\n",
    "        \n",
    "        a = a.unsqueeze(1)\n",
    "        \n",
    "        #a = [batch size, 1, src len]\n",
    "        \n",
    "        encoder_outputs = encoder_outputs.permute(1, 0, 2)\n",
    "        \n",
    "        #encoder_outputs = [batch size, src len, enc hid dim * 2]\n",
    "        \n",
    "        weighted = ops.bmm(a, encoder_outputs)\n",
    "        \n",
    "        #weighted = [batch size, 1, enc hid dim * 2]\n",
    "        \n",
    "        weighted = weighted.permute(1, 0, 2)\n",
    "        \n",
    "        #weighted = [1, batch size, enc hid dim * 2]\n",
    "        \n",
    "        rnn_input = ops.cat((embedded, weighted), axis = 2)\n",
    "        \n",
    "        #rnn_input = [1, batch size, (enc hid dim * 2) + emb dim]\n",
    "            \n",
    "        output, hidden = self.rnn(rnn_input, hidden.unsqueeze(0))\n",
    "        \n",
    "        #output = [seq len, batch size, dec hid dim * n directions]\n",
    "        #hidden = [n layers * n directions, batch size, dec hid dim]\n",
    "        \n",
    "        #seq len, n layers and n directions will always be 1 in this decoder, therefore:\n",
    "        #output = [1, batch size, dec hid dim]\n",
    "        #hidden = [1, batch size, dec hid dim]\n",
    "        #this also means that output == hidden\n",
    "        assert (output == hidden).all()\n",
    "        \n",
    "        embedded = embedded.squeeze(0)\n",
    "        output = output.squeeze(0)\n",
    "        weighted = weighted.squeeze(0)\n",
    "        \n",
    "        prediction = self.fc_out(ops.cat((output, weighted, embedded), axis = 1))\n",
    "        \n",
    "        #prediction = [batch size, output dim]\n",
    "        \n",
    "        return prediction, hidden.squeeze(0), a.squeeze(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Seq2Seq\n",
    "\n",
    "这是第一个不需要使编码器RNN和解码器RNN具有相同隐藏维度的模型，但是编码器必须是双向的。可以通过将所有出现的 `enc_dim * 2` 更改为 `enc_dim * 2 if encoder_is_bidirectional else enc_dim` 来移除此要求。\n",
    "\n",
    "这个seq2seq封装器与前两个类似。唯一的区别是 `encoder` 返回最终隐藏状态（即从前向和后向编码器RNN传递过线性层的最终隐藏状态），用作解码器的初始隐藏状态，以及每个隐藏状态（即前向和后向隐藏状态堆叠在一起）。我们还需要确保将 `hidden` 和 `encoder_outputs` 传递给解码器。\n",
    "\n",
    "简要概述所有步骤：\n",
    "- 创建 `outputs` 张量以保存所有预测 $\\hat{Y}$\n",
    "- 将源序列 $X$ 输入编码器以接收 $z$ 和 $H$\n",
    "- 将初始解码器隐藏状态设置为 `context` 向量，$s_0 = z = h_T$\n",
    "- 使用一批 `<sos>` 标记作为第一个 `input`，$y_1$\n",
    "- 然后在循环内解码：\n",
    "  - 将输入标记 $y_t$、前一个隐藏状态 $s_{t-1}$ 和所有编码器输出 $H$ 插入解码器\n",
    "  - 接收预测 $\\hat{y}_{t+1}$ 和新的隐藏状态 $s_t$\n",
    "  - 然后决定是否使用 teacher force，设置下一个输入为适当的值\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Seq2Seq(nn.Cell):\n",
    "    def __init__(self, encoder, decoder):\n",
    "        super().__init__()\n",
    "        \n",
    "        self.encoder:Encoder = encoder\n",
    "        self.decoder:Decoder = decoder\n",
    "        \n",
    "    def construct(self, src:ms.Tensor, trg:ms.Tensor, teacher_forcing_ratio = 0.5):\n",
    "        \n",
    "        #src = [src len, batch size]\n",
    "        #trg = [trg len, batch size]\n",
    "        #teacher_forcing_ratio is probability to use teacher forcing\n",
    "        #e.g. if teacher_forcing_ratio is 0.75 we use teacher forcing 75% of the time\n",
    "        \n",
    "        batch_size = src.shape[1]\n",
    "        trg_len = trg.shape[0]\n",
    "        trg_vocab_size = self.decoder.output_dim\n",
    "        \n",
    "        #tensor to store decoder outputs\n",
    "        # outputs = torch.zeros(trg_len, batch_size, trg_vocab_size).to(self.device)\n",
    "        outputs = []\n",
    "        #encoder_outputs is all hidden states of the input sequence, back and forwards\n",
    "        #hidden is the final forward and backward hidden states, passed through a linear layer\n",
    "        encoder_outputs, hidden = self.encoder(src)\n",
    "                \n",
    "        #first input to the decoder is the <sos> tokens\n",
    "        input = trg[0,:]\n",
    "        \n",
    "        for t in range(1, trg_len):\n",
    "            #insert input token embedding, previous hidden state and all encoder hidden states\n",
    "            #receive output tensor (predictions) and new hidden state\n",
    "            output, hidden, _ = self.decoder(input, hidden, encoder_outputs)\n",
    "            if len(outputs) == 0:\n",
    "                outputs.append(ops.zeros(output.shape, dtype=output.dtype))\n",
    "            #place predictions in a tensor holding predictions for each token\n",
    "            # outputs[t] = output\n",
    "            outputs.append(output)\n",
    "            \n",
    "            #get the highest predicted token from our predictions\n",
    "            top1 = output.argmax(1) \n",
    "            if self.training:\n",
    "                teacher_force = random.random() < teacher_forcing_ratio\n",
    "                # get the highest predicted token from our predictions\n",
    "                \n",
    "                # if teacher forcing, use actual next token as next input\n",
    "                # if not, use predicted token\n",
    "                input = trg[t] if teacher_force else top1\n",
    "                # input = [batch size]\n",
    "            else:\n",
    "                input = top1\n",
    "        # return outputs\n",
    "        return ops.stack(outputs, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_dim = len(de_vocab)\n",
    "output_dim = len(en_vocab)\n",
    "encoder_embedding_dim = 256\n",
    "decoder_embedding_dim = 256\n",
    "encoder_hidden_dim = 512\n",
    "decoder_hidden_dim = 512\n",
    "encoder_dropout = 0.5\n",
    "decoder_dropout = 0.5\n",
    "\n",
    "attention = Attention(encoder_hidden_dim, decoder_hidden_dim)\n",
    "\n",
    "encoder = Encoder(\n",
    "    input_dim,\n",
    "    encoder_embedding_dim,\n",
    "    encoder_hidden_dim,\n",
    "    decoder_hidden_dim,\n",
    "    encoder_dropout,\n",
    ")\n",
    "\n",
    "decoder = Decoder(\n",
    "    output_dim,\n",
    "    decoder_embedding_dim,\n",
    "    encoder_hidden_dim,\n",
    "    decoder_hidden_dim,\n",
    "    decoder_dropout,\n",
    "    attention,\n",
    ")\n",
    "\n",
    "\n",
    "model = Seq2Seq(encoder, decoder)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Seq2Seq<\n",
       "  (encoder): Encoder<\n",
       "    (embedding): Embedding<vocab_size=7853, embedding_size=256, use_one_hot=False, embedding_table=Parameter (name=encoder.embedding.embedding_table, shape=(7853, 256), dtype=Float32, requires_grad=True), dtype=Float32, padding_idx=None>\n",
       "    (rnn): GRU<\n",
       "      (rnn): _DynamicGRUCPUGPU<>\n",
       "      (dropout_op): Dropout<p=0.0>\n",
       "      >\n",
       "    (fc): Dense<input_channels=1024, output_channels=512, has_bias=True>\n",
       "    (dropout): Dropout<p=0.5>\n",
       "    >\n",
       "  (decoder): Decoder<\n",
       "    (attention): Attention<\n",
       "      (attn): Dense<input_channels=1536, output_channels=512, has_bias=True>\n",
       "      (v): Dense<input_channels=512, output_channels=1>\n",
       "      >\n",
       "    (embedding): Embedding<vocab_size=5893, embedding_size=256, use_one_hot=False, embedding_table=Parameter (name=decoder.embedding.embedding_table, shape=(5893, 256), dtype=Float32, requires_grad=True), dtype=Float32, padding_idx=None>\n",
       "    (rnn): GRU<\n",
       "      (rnn): _DynamicGRUCPUGPU<>\n",
       "      (dropout_op): Dropout<p=0.0>\n",
       "      >\n",
       "    (fc_out): Dense<input_channels=1792, output_channels=5893, has_bias=True>\n",
       "    (dropout): Dropout<p=0.5>\n",
       "    >\n",
       "  >"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def init_weights(m:nn.Cell):\n",
    "    for name, param in m.parameters_and_names():\n",
    "        if \"weight\" in name:\n",
    "            param.set_data(ops.normal(param.shape, ms.Tensor([0.]), ms.Tensor([0.01])))\n",
    "        else:\n",
    "            param.set_data(ops.zeros(param.shape, dtype=param.dtype))\n",
    "\n",
    "model.apply(init_weights)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The model has 20,518,405 trainable parameters\n"
     ]
    }
   ],
   "source": [
    "def count_parameters(model):\n",
    "    return sum(p.numel() for p in model.get_parameters() if p.requires_grad)\n",
    "\n",
    "print(f'The model has {count_parameters(model):,} trainable parameters')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = nn.Adam(model.trainable_params())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "criterion = nn.CrossEntropyLoss(ignore_index=pad_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def forward_fn(src, trg, teacher_forcing_ratio):\n",
    "    # src = [src length, batch size]\n",
    "    # trg = [trg length, batch size]\n",
    "    output = model(src, trg, teacher_forcing_ratio)\n",
    "    # output = [trg length, batch size, trg vocab size]\n",
    "    output_dim = output.shape[-1]\n",
    "    output = output[1:].view(-1, output_dim)\n",
    "    # output = [(trg length - 1) * batch size, trg vocab size]\n",
    "    trg = trg[1:].view(-1)\n",
    "    # trg = [(trg length - 1) * batch size]\n",
    "    loss = criterion(output, trg.astype(ms.int32))\n",
    "    return loss\n",
    "\n",
    "grad_fn = ms.value_and_grad(forward_fn, grad_position=None, weights=model.trainable_params())\n",
    "\n",
    "\n",
    "def train_fn(data_loader, optimizer, clip, teacher_forcing_ratio):\n",
    "    epoch_loss = 0.\n",
    "    model.set_train(True)\n",
    "    for i, batch in enumerate(tqdm(data_loader)):\n",
    "        src = batch[\"de_ids\"]\n",
    "        trg = batch[\"en_ids\"]\n",
    "        loss, grads = grad_fn(src, trg, teacher_forcing_ratio)\n",
    "        # grads = ops.clip_by_norm(grads, max_norm=clip)\n",
    "        optimizer(grads)\n",
    "        epoch_loss += float(loss)\n",
    "\n",
    "    return epoch_loss / len(data_loader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate_fn(model:Seq2Seq, data_loader, criterion):\n",
    "    epoch_loss = 0\n",
    "    model.set_train(False)\n",
    "    for i, batch in enumerate(data_loader):\n",
    "        src = batch[\"de_ids\"]\n",
    "        trg = batch[\"en_ids\"]\n",
    "        # src = [src length, batch size]\n",
    "        # trg = [trg length, batch size]\n",
    "        output = model(src, trg, 0) # turn off teacher forcing\n",
    "        # output = [trg length, batch size, trg vocab size]\n",
    "        output_dim = output.shape[-1]\n",
    "        output = output[1:].view(-1, output_dim)\n",
    "        # output = [(trg length - 1) * batch size, trg vocab size]\n",
    "        trg = trg[1:].view(-1)\n",
    "        # trg = [(trg length - 1) * batch size]\n",
    "        loss = criterion(output, trg.astype(ms.int32))\n",
    "        epoch_loss += float(loss)\n",
    "    return epoch_loss / len(data_loader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tqdm.auto import tqdm  # 正确导入tqdm函数\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "n_epochs = 20  # 修改训练周期为20\n",
    "train_losses = []\n",
    "valid_losses = []\n",
    "\n",
    "for epoch in tqdm(range(n_epochs)):\n",
    "    train_loss = train_fn(train_data_loader, optimizer, 1.0, 0.5)\n",
    "    valid_loss = evaluate_fn(model, valid_data_loader, criterion)\n",
    "    \n",
    "    train_losses.append(train_loss)\n",
    "    valid_losses.append(valid_loss)\n",
    "    \n",
    "    # 绘制损失曲线\n",
    "    plt.figure()\n",
    "    plt.plot(train_losses, label='Train Loss')\n",
    "    plt.plot(valid_losses, label='Valid Loss')\n",
    "    plt.xlabel('Epoch')\n",
    "    plt.ylabel('Loss')\n",
    "    plt.legend()\n",
    "    plt.savefig(f'loss_curve_epoch{epoch+1}.png')\n",
    "    plt.close()\n",
    "\n",
    "    # 保存第20个epoch的模型\n",
    "    if epoch == 19:\n",
    "        ms.save_checkpoint(model, f'seq2seq20_{valid_loss:.2f}.ckpt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: http://repo.myhuaweicloud.com/repository/pypi/simple\n",
      "Requirement already satisfied: nltk in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (3.8.1)\n",
      "Requirement already satisfied: regex>=2021.8.3 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from nltk) (2024.4.16)\n",
      "Requirement already satisfied: joblib in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from nltk) (1.3.2)\n",
      "Requirement already satisfied: click in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from nltk) (8.1.8)\n",
      "Requirement already satisfied: tqdm in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from nltk) (4.67.1)\n",
      "Requirement already satisfied: importlib-metadata in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from click->nltk) (6.7.0)\n",
      "Requirement already satisfied: typing-extensions>=3.6.4 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from importlib-metadata->click->nltk) (4.4.0)\n",
      "Requirement already satisfied: zipp>=0.5 in /home/ma-user/anaconda3/envs/mindspore211/lib/python3.7/site-packages (from importlib-metadata->click->nltk) (3.15.0)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1000/1000 [02:26<00:00,  6.81it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Top 5 BLEU Scores:\n",
      "[1] BLEU=1.0000\n",
      "  Source: Ein braun-weißer Hund holt ein Spielzeug.\n",
      "  Reference: a brown and white dog fetching a toy .\n",
      "  Prediction: a brown and white dog fetching a toy .\n",
      "\n",
      "[2] BLEU=1.0000\n",
      "  Source: Ein Mann und ein Junge auf einem felsigen Strand.\n",
      "  Reference: a man and a boy on a rocky beach .\n",
      "  Prediction: a man and a boy on a rocky beach .\n",
      "\n",
      "[3] BLEU=1.0000\n",
      "  Source: Eine Frau in einem rosa Rock hält ein Baby.\n",
      "  Reference: a woman in a pink skirt is holding a baby .\n",
      "  Prediction: a woman in a pink skirt is holding a baby .\n",
      "\n",
      "[4] BLEU=1.0000\n",
      "  Source: Ein schwarz-weißer Hund spielt mit einem weißen Ball.\n",
      "  Reference: a black and white dog is playing with a white ball .\n",
      "  Prediction: a black and white dog is playing with a white ball .\n",
      "\n",
      "[5] BLEU=1.0000\n",
      "  Source: Ein brauner Hund gräbt im Dreck.\n",
      "  Reference: a brown dog is digging in the dirt .\n",
      "  Prediction: a brown dog is digging in the dirt .\n",
      "\n",
      "\n",
      "Bottom 5 BLEU Scores:\n",
      "[1] BLEU=0.0151\n",
      "  Source: Ein Crack-Opfer tut so, als würde es seine Hände aufwärmen wollen, raucht aber in Wahrheit Crack.\n",
      "  Reference: a crackhead is pretending to keep his hands warm but actually he is smoking crack .\n",
      "  Prediction: an <unk> surgical <unk> as an all , is not to be , they are <unk> .\n",
      "\n",
      "[2] BLEU=0.0151\n",
      "  Source: Ein Runner versucht, Extra-Yards zu machen während er von zwei Tacklern zu Boden gebracht wird.\n",
      "  Reference: a runner scrambles for yardage while being brought down by two tacklers .\n",
      "  Prediction: a <unk> trying trying to keep a as as he <unk> two <unk> onto the ground .\n",
      "\n",
      "[3] BLEU=0.0138\n",
      "  Source: Zwei Spielerinnen der US-Nationalmannschaft klatschen im Sprung ab, umgeben von zwei weiteren Spielerinnen.\n",
      "  Reference: two female members of team usa performing a jump high - five surrounded by two other female members .\n",
      "  Prediction: two <unk> <unk> <unk> in the two of two men are <unk> .\n",
      "\n",
      "[4] BLEU=0.0121\n",
      "  Source: Die # 8 von Iowa State streckt den Arm in Richtung eines Spielers der Texas AM beim Versuch, ihn zu tackeln.\n",
      "  Reference: # 8 for iowa state stiff arms a texas am player attempting to tackle him .\n",
      "  Prediction: the <unk> of the driver of <unk> arms is <unk> the <unk> , while the <unk> is <unk> .\n",
      "\n",
      "[5] BLEU=0.0116\n",
      "  Source: Ein britischer Gentleman in voller militärischer Uniform winkt mit seiner Mütze Leuten zu, die im Hintergrund sitzen und auf den Kanal blicken.\n",
      "  Reference: a british gentleman , dressed in full military uniform , waving his hat with a background of people sitting back and looking out onto the waterway .\n",
      "  Prediction: a military chef in in uniform is uniform is in the hat on people look on the background .\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "!pip install nltk\n",
    "from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction\n",
    "ms.load_checkpoint(f\"seq2seq20_4.55.ckpt\", model)\n",
    "\n",
    "bleu_scores = []\n",
    "sentence_pairs = []\n",
    "\n",
    "def translate_sentence(\n",
    "    sentence, \n",
    "    model:Seq2Seq,\n",
    "    en_nlp:spacy.Language,\n",
    "    de_nlp:spacy.Language,\n",
    "    en_vocab:Vocab,\n",
    "    de_vocab:Vocab,\n",
    "    lower,\n",
    "    sos_token,\n",
    "    eos_token,\n",
    "    max_output_length=25,\n",
    "):\n",
    "    model.set_train(False)\n",
    "    if isinstance(sentence, str):\n",
    "        tokens = [token.text for token in de_nlp.tokenizer(sentence)]\n",
    "    else:\n",
    "        tokens = [token for token in sentence]\n",
    "    if lower:\n",
    "        tokens = [token.lower() for token in tokens]\n",
    "    tokens = [sos_token] + tokens + [eos_token]\n",
    "    ids = de_vocab.lookup_indices(tokens)\n",
    "\n",
    "    tensor = ms.Tensor(ids).astype(ms.int64).unsqueeze(-1)\n",
    "    encoder_outputs, hidden = model.encoder(tensor)\n",
    "    \n",
    "    inputs = en_vocab.lookup_indices([sos_token])\n",
    "    attentions = ops.zeros((max_output_length, 1, len(ids)))\n",
    "    for i in range(max_output_length):\n",
    "        inputs_tensor = ms.Tensor(inputs[-1]).unsqueeze(-1).astype(ms.int64)\n",
    "        \n",
    "        output, hidden, attention = model.decoder(inputs_tensor, hidden, encoder_outputs)\n",
    "        attentions[i] = attention\n",
    "        predicted_token = output.argmax(-1).item()\n",
    "        inputs.append(int(predicted_token))\n",
    "        if predicted_token == en_vocab[eos_token]:\n",
    "            break\n",
    "    en_tokens = en_vocab.lookup_tokens(inputs)\n",
    "    return en_tokens, tokens, attentions[:len(en_tokens)-1]\n",
    "\n",
    "model.set_train(False)  # 确保模型在评估模式\n",
    "for example in tqdm(test_data):\n",
    "    # 获取原句和参考翻译\n",
    "    src_sentence = example[\"de\"]\n",
    "    ref_tokens = example[\"en_tokens\"][1:-1]  # 去除<sos>和<eos>\n",
    "    \n",
    "    # 使用模型翻译\n",
    "    translated_tokens, src_tokens, _ = translate_sentence(\n",
    "        src_sentence, \n",
    "        model,\n",
    "        en_nlp,\n",
    "        de_nlp,\n",
    "        en_vocab,\n",
    "        de_vocab,\n",
    "        lower,\n",
    "        sos_token,\n",
    "        eos_token\n",
    "    )\n",
    "    \n",
    "    # 去除模型翻译中的<sos>和<eos>\n",
    "    hyp_tokens = translated_tokens[1:-1]  \n",
    "    \n",
    "    # 计算BLEU分数（使用nltk的句子级BLEU）\n",
    "    smooth = SmoothingFunction().method1  # 使用平滑方法处理短句子\n",
    "    score = sentence_bleu(\n",
    "        [ref_tokens], \n",
    "        hyp_tokens,\n",
    "        smoothing_function=smooth\n",
    "    )\n",
    "    \n",
    "    # 保存结果\n",
    "    bleu_scores.append(score)\n",
    "    sentence_pairs.append( (src_sentence, ref_tokens, hyp_tokens, score) )\n",
    "\n",
    "# 按BLEU分数排序\n",
    "sorted_pairs = sorted(sentence_pairs, key=lambda x: x[3], reverse=True)\n",
    "\n",
    "# 提取最高和最低的5对\n",
    "top5 = sorted_pairs[:5]\n",
    "bottom5 = sorted_pairs[-5:]\n",
    "\n",
    "# 打印结果\n",
    "print(\"\\nTop 5 BLEU Scores:\")\n",
    "for idx, (src, ref, hyp, score) in enumerate(top5):\n",
    "    print(f\"[{idx+1}] BLEU={score:.4f}\")\n",
    "    print(f\"  Source: {src}\")\n",
    "    print(f\"  Reference: {' '.join(ref)}\")\n",
    "    print(f\"  Prediction: {' '.join(hyp)}\\n\")\n",
    "\n",
    "print(\"\\nBottom 5 BLEU Scores:\")\n",
    "for idx, (src, ref, hyp, score) in enumerate(bottom5):\n",
    "    print(f\"[{idx+1}] BLEU={score:.4f}\")\n",
    "    print(f\"  Source: {src}\")\n",
    "    print(f\"  Reference: {' '.join(ref)}\")\n",
    "    print(f\"  Prediction: {' '.join(hyp)}\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们改进了之前的模型，但代价是训练时间翻倍!\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型评估\n",
    "### 翻译与可视化\n",
    "\n",
    "我们首先需要使用模型翻译测试集的每个例子，我们使用下面的 `translate_sentence` 函数来实现这一点。\n",
    "## 推断\n",
    "\n",
    "我们的 `translate_sentence` 将执行以下操作：\n",
    "- 确保我们的模型处于评估模式，对于推断来说，它应该一直是这样的\n",
    "- 如果源句子没有被标记，则对其进行标记\n",
    "- 数字化源句子\n",
    "- 将其转换为张量并添加一个批次维度\n",
    "- 获取源句子的长度并转换为张量\n",
    "- 将源句子输入到编码器中\n",
    "- 创建一个列表来保存输出句子，初始化为 `<sos>` token\n",
    "- 创建一个张量来保存 attention 值\n",
    "- 当我们尚未达到最大长度时\n",
    "  - 获取输入张量，应该是 `<sos>` 或最后预测的 token\n",
    "  - 将输入、所有编码器输出、隐藏状态和 mask 传递到解码器中\n",
    "  - 存储 attention 值\n",
    "  - 获取下一个预测的 token\n",
    "  - 将预测添加到当前输出句子预测中\n",
    "  - 如果预测是 `<eos>` token，则中断\n",
    "- 将输出句子从索引转换为 token\n",
    "- 返回输出句子（去除 `<sos>` token）和对整个序列的 attention 值\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "def translate_sentence(\n",
    "    sentence, \n",
    "    model:Seq2Seq,\n",
    "    en_nlp:spacy.Language,\n",
    "    de_nlp:spacy.Language,\n",
    "    en_vocab:Vocab,\n",
    "    de_vocab:Vocab,\n",
    "    lower,\n",
    "    sos_token,\n",
    "    eos_token,\n",
    "    max_output_length=25,\n",
    "):\n",
    "    model.set_train(False)\n",
    "    if isinstance(sentence, str):\n",
    "        tokens = [token.text for token in de_nlp.tokenizer(sentence)]\n",
    "    else:\n",
    "        tokens = [token for token in sentence]\n",
    "    if lower:\n",
    "        tokens = [token.lower() for token in tokens]\n",
    "    tokens = [sos_token] + tokens + [eos_token]\n",
    "    ids = de_vocab.lookup_indices(tokens)\n",
    "\n",
    "    tensor = ms.Tensor(ids).astype(ms.int64).unsqueeze(-1)\n",
    "    encoder_outputs, hidden = model.encoder(tensor)\n",
    "    \n",
    "    inputs = en_vocab.lookup_indices([sos_token])\n",
    "    attentions = ops.zeros((max_output_length, 1, len(ids)))\n",
    "    for i in range(max_output_length):\n",
    "        inputs_tensor = ms.Tensor(inputs[-1]).unsqueeze(-1).astype(ms.int64)\n",
    "        \n",
    "        output, hidden, attention = model.decoder(inputs_tensor, hidden, encoder_outputs)\n",
    "        attentions[i] = attention\n",
    "        predicted_token = output.argmax(-1).item()\n",
    "        inputs.append(int(predicted_token))\n",
    "        if predicted_token == en_vocab[eos_token]:\n",
    "            break\n",
    "    en_tokens = en_vocab.lookup_tokens(inputs)\n",
    "    return en_tokens, tokens, attentions[:len(en_tokens)-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这段代码用于绘制注意力矩阵的可视化图。展示模型在翻译时对输入句子的注意力分布。横轴表示输入句子的词汇，纵轴表示翻译结果的词汇，而颜色的深浅表示不同位置的注意力权重。这样的图可以帮助我们理解模型在翻译时的关注点。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x1000 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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L72kmJgYDR48WA6HQx06dHAZt23bNoWHh9uUMucoJ8ix/NbMYZ74+Hi7I3icIkWKaO3atcrIyMjyksuSlJGRoXXr1vHvEriFDh48aHcEFFCDBw/WN998o08++USffPKJLMvSo48+qnr16jnHbN++Xfv379fzzz9vY9KcoZwgx/JbM4d5MjIyslxvWZYSEhK0ePFivfnmm+rRo4fef//9PE5npnvuuUdff/21+vXrp+HDhysoKMhle3JysgYMGKADBw6oW7duNqUE8j8uNgG7REREaMuWLRo7dqxOnjypRo0aqU+fPi5jNm3apA4dOuiRRx6xJ6QbuFoXcuzw4cNq0KCBzp07J0nOZj5t2jTnmO3bt+v222/X888/r48//timpMjPNm/erGbNmunjjz/WU089ZXcc2x05ckRNmjTRH3/8oeDgYLVr1875IenQoUNatGiRkpKSVLp0aa1Zs4Y/HAAAjEY5gVuOHDmSqZn/+VCSKVOmaNasWRowYIBatGhhY1LkZ5GRkTp79qzLYYYFWXx8vJ599ln9+OOPWW5v27atRo0a5XJ/IgB54/Tp05oyZYrWrl2rU6dOKSYmRgMHDpT0/w+1ufvuu1W4cGGbkwJmoJwA8DhdunTRwoULdfHiRbujGOXgwYNasWKF81KRZcuWVYsWLdy60ACA3PPtt9/qySefVHJysvNGqL1793beNX7x4sW69957NXHiRK6kh79t69at+uyzzxQXF6ejR49KksqVK6dWrVrpH//4h+rWrWtzwpyhnADwKGfOnFGtWrXk5eXlEddrh3kmTZqkKlWqqHnz5tcdt3r1au3Zs0e9evXKo2TIT1atWqVWrVopODhYr7/+ulq0aKE77rhDffr0cZaT9PR0lSxZUlFRUZo9e7bNieHJPvroI7322mtKT09XVh/tfXx89MEHH6h///42pHMPJ8TDbfmlmcM8y5cvz3ZbcnKy9uzZo1GjRunkyZPq169fHiZDftKnTx/16dPnhuVk3LhxGj9+POUEN+Xdd9+Vl5eXfvrpJzVs2DDLMd7e3mrYsKF+++23PE6H/OSnn37Syy+/rMKFC6tfv37q2bOnKlSoIIfDofj4eE2ePFlffPGFXnnlFdWpU0cxMTF2R74uygnckl0z37Vrl3bt2qXx48d7TDOHeaKiom54vX/LshQZGan33nsvj1J5htjYWC1fvlzHjx9XampqlmMcDofGjRuXx8k8V0ZGBvefwE1buXKlmjVrlm0xuaZMmTLcuBh/y4gRI+Tj46PFixdn+qNL3bp19cEHH6hz585q1aqVhg8fTjlB/pHfmjnM06tXr2w/DPr6+qps2bKKjIxUdHR0HiczV2Jiojp06KC4uLgsp/L/jHLingMHDig4ONjuGPBQFy9eVMmSJW847uzZs3mQBvnZ2rVrFRkZed3Z4GbNmikqKsojijDlBDmW35o5zDNhwgS7I3icf/7zn1q+fLmqVKmifv36qVq1apnudQLp3//+t8vXmzdvzrTumrS0NO3evVvLly9XmzZt8iIe8qFy5cpp+/bt1x1jWZZ+++03rqSHvyWnRbhkyZIecSEZyglyLL81cyA/mDdvnkqXLq3Vq1erWLFidscx1pAhQ+RwOJxXTNq8ebM2b9583ceUKlVK7777bt4ERL7Trl07jRo1StOnT9djjz2W5ZixY8cqISGBG6TibwkPD9eqVauUlpYmH5+sP9qnpaVp1apVHnGvK8oJciy/NXMgP0hMTNR9991HMbmBr776StLVv1T37dtXLVq00BNPPJHlWF9fX4WGhqpp06by8/PLy5jIRwYNGqSvv/5avXr10qZNm9SpUydJ0oULF7Rp0ybNmTNHw4YNU8mSJfXyyy/bnBaerEOHDho+fLj69u2rjz/+WEWLFnXZnpSUpP79++vw4cMaMGCAPSHdwKWEkWPVqlXTlStXtHfv3us286pVq6pQoULas2dPHidEfrFixQrNmzdPe/fu1fnz57M8l8LhcGjJkiU2pDNLvXr1FBoaqoULF9odxWNER0fr3nvvdd4ID7hVVq1apS5duujEiROZzqezLEulSpXSvHnzdOedd9qUEPnBmTNn1KRJE8XHxyswMFDt2rVThQoVJEmHDh3SokWLlJSUpEqVKmndunW67bbb7A18A5QT5Nhrr72m4cOHq0ePHtdt5pMmTdKAAQM0bNgwe4LCY1mWpSeeeEITJ050FpJrh+Jc8+dDc9LT0+2KaoyxY8fqhRde0LZt21SlShW74wD4i/Pnz2vcuHH66aefFB8fr4yMDIWFhalNmzZ65plnFBISYndE5APHjh3TM888owULFmS5vX379ho9erRCQ0PzOJn7KCfIsfzWzPNSWlqaTp8+ne0lXiUpIiIiDxOZadSoUXruuefUuHFjDR06VKNGjdKcOXO0a9cuHThwQDNmzNDkyZP1yiuv6B//+IfKly9vd2Qj/POf/9SUKVP09ttvq02bNgoLC7M7EvIx3s8Acx08eFArVqxw3qQ4NDRULVq08KiLLlBO4Jb81Mzzws8//6y3335bq1ev1pUrV7Id53A4lJaWlofJzHTnnXdqx44dio+PV/HixfX4449r0qRJLjMkM2fO1KOPPqrZs2erQ4cONqY1g7e3tyQ5Z5Oup6D+nLVu3fqmH8vhg/8f72cA8gInxMMtoaGh+u677/JFM7/Vvv/+e3Xq1Enp6em67bbbVLFiRS7xegM7d+5U8+bNVbx4cUlyfthOT093fgh/6KGH1KhRI3344YeUE129Sgs3Cry+2NjYm34s+/Yq3s8Az7F3716dOnVKxYsXV7Vq1eyO4zbKCW5KxYoVKSI38NZbbykjI0MjR47U888/7/xwjexlZGQ4i4kkFS5cWNLVm5SVKFHCub5q1arZzt4VNPHx8XZHMN7BgwftjuDxeD+7MS8vL3l5eWnHjh2qVq2aW/uI2Sb8XampqXrrrbc0ZswY5409e/furfHjx0uSpkyZohEjRmj8+PGqX7++jUlvjHKCXLFz505t375d4eHhXHXk/2zfvl3NmjVT//797Y7iMcqVK+ecjZPkPKdk06ZNLjfD27NnT7ZXjAP+inOT/j7ez24sIiJCDodDhQoVksSsJvJOSkqKWrdurbVr16p06dK67777Mv0Br3Xr1urdu7e++eYb48uJl90B4DlmzJih1q1bZ7rB4quvvqo6dero0UcfVfPmzZ1T/wVdYGAgJ4W6qWHDhtqxY4fz56dt27ayLEsDBw7Url27dP78eX3wwQfasGGDGjRoYHNaoODg/ezG4uPjdfDgQedRBde+zukC3Kxhw4ZpzZo16tu3rw4cOKDvvvsu05jQ0FDVqlVLP//8sw0J3cOfHpFjU6ZM0ebNm10+FK5cuVIjRoxQcHCw2rdvr9WrV2v+/PmaOnWqevXqZWNa+919991av3693TE8yoMPPqgZM2ZowYIFevDBB1WvXj099thjmj59umrXru0c5+Pjo3feecfGpOaYNGmSW+ML+r/LP7t8+bJmzZqluLg4HT16VNLV2buWLVuqS5cu8vX1tTmhOXg/A8w1Y8YMRUREaNSoUdc9qqB69er69ddf8zDZzeFqXcixihUrqnz58i4nlz777LMaM2aMFi5cqLZt2+rMmTOqWLGi6tWrp+XLl9sX1gAJCQlq0qSJevfurXfeeYfDkHIoNTVVPj4+zuO1r1y5ouHDh2vu3Lk6e/asqlWrpoEDB6ply5Y2JzWDl5dXjg4d4d4wrn799Vd169ZNR44cyXSTT4fDobCwME2bNk3Nmze3KaFZeD8DzBUQEKD27dtr5syZznVeXl7q06eP85wTSerWrZtmz56tS5cu2REzx3h3QY798ccfmX5RL126VKVKlVLbtm0lScWKFVOrVq20YcMGOyIa5auvvtK9996rDz/8ULNmzVJUVJTCwsLk5ZX5aEqHw6HXX3/dhpTm8fPzc/m6UKFCGjRokAYNGmRTIrO98cYbWZaTjIwMJSQkaNmyZTp48KD69OnDuRf/Z8+ePbr33nuVnJysRo0aqUePHqpQoYIcDofi4+M1efJkbdiwQffdd5/WrVunqlWr2h3Zdryf3bzNmzfr888/V1xcnMsVLlu2bKl+/fqpYcOGNieEpwsICHCeBH89Bw8e9Ix70FlADhUvXty6//77nV8fO3bMcjgc1qOPPuoyrkePHpa/v39exzOOw+GwvLy8LIfDccPFy8vL7rhGaNCggfXQQw/ZHSNfuXLlivXCCy9YpUqVsg4dOmR3HCP06tXLcjgc1n//+99sx3z00UeWw+GwevfunXfBDMb72c156623LB8fn2z3lbe3t/Xmm2/aHRMeLjo62goODrb++OMP5zqHw2E9/vjjzq8PHDhg+fn5WQ888IAdEd3CzAlyrFKlSoqLi9O5c+dUtGhRTZ06VQ6Hwzlrcs2JEydUqlQpm1Ka46uvvrI7gsfZvXu3atSoYXeMfMXHx0cjR47U/PnzNWjQIH399dd2R7LdkiVL1KBBg+teeerFF1/UxIkTPeLk0bzA+5n7Jk+erCFDhigwMFDPPfecunbtqgoVKkiSDh06pGnTpumzzz7Tf/7zH1WuXFk9e/a0NzA81lNPPaXY2Fh17dpV06dPd7n0viSdO3dOffv21ZUrV/T000/blDLnOOcEOfb555/r+eefV8WKFVW/fn0tWLBAfn5+OnDggPPeFFeuXFGpUqXUuHFj/fTTTzYnhqepX7++SpcurR9//NHuKPlOly5dtHz5cp08edLuKLbz8/PTQw89pKlTp153XPfu3TVr1izjj8+GmRo1aqTffvtNK1euVKNGjbIcs2HDBjVv3lx16tThcGj8Ld26ddP06dMVGBio5s2ba/Hixapatapq1KihZcuWKSkpSb169dKECRPsjnpDXEoYOfbUU0+pS5cuOnjwoObMmaNChQpp9OjRLjfN+/7775WYmKjWrVvbmBSe6oknntCyZcu0a9cuu6PkOydOnNCFCxfsjmGE4sWLa/fu3Tcct2fPHhUrViwPEiE/2rlzp6Kjo7MtJtLVAtO6dWvt3LkzD5MhP5o6daref/99+fv7a/HixZKu3in+u+++k8Ph0DvvvOMxM6Ac1oUcK1SokL799lvFx8fr5MmTqlGjhoKCglzGVKxYUXPmzFHTpk1tSglP9sILL2j79u2KjIzUoEGD9MADDygiIoJLuv4NGRkZ+uyzz7Rq1SrdcccddscxQnR0tKZPn64vvvhC/fr1y3LMl19+qQ0bNqhbt255nA75RXBwcI5OPg4JCVFwcHAeJEJ+5nA49Nprr+mVV17Rxo0bFR8fr4yMDIWFhalJkyYe9XuUw7qAXNK6dWs5HA5NnDhRYWFhbs0eORwOLVmy5Bam8wzXLh9s/d9lb6/H4XAoLS0tL2IZ7Xo/Z8nJyTp48KDOnDkjh8Oh7777Tvfee28epjPTzp071bhxY126dEnNmzdXt27dMp0LsGLFCgUEBGjdunWqWbOmvYFtwPvZ39enTx8tXrxY+/fvV0BAQJZjUlJSVLlyZbVp00YTJ07M44SAmSgnyJGEhARt2rRJNWrUULVq1bIdt3DhQlmWpfvuuy8P05nh2v0mdu7cqWrVqmV5ic3scP+Jq65dzjWnuKuybvhz5uPjo2bNmumNN95QTExMHqUy35IlS9S9e3f98ccfmX7mLMtS6dKlNXXq1AJ7iCrvZ3/fiRMn1LRpU9WsWVOffPKJqlSp4rJ9//79euGFF7Rjxw6tXr1aZcqUsSkpPFl+/HxGOUGOHDhwQFWqVFF0dHS2fxHbtm2b6tWrp3vvvVcLFizI44T2O3TokKSrd5j28fFxfp1T3IMCN+N6P2e+vr4qUaKEChUqlIeJPMfFixc1Y8YMrVixItP9Jx555BEVLlzY5oT24f3s7+vbt6/OnDmj+fPny9vbW/Xr13ful0OHDmnz5s3KyMjQ/fff73LupnS14I0bN86O2PAw+fHzGeUEOdayZUutWrVKBw8eVHh4eKbtAwcO1PDhwzVt2jQ98sgjNiREfnTtxlJFixZ1a1YFAOzkzmzTXzH7BHfkt89nlBPk2NixY/X000/r3XffzXS3bsuyFB4erpSUFB0/ftyjTry61U6fPq0pU6Zo7dq1OnXqlGJiYjRw4EBJ0vbt27V//37dfffdBfqvtH81f/58ffrpp1q5cqVSUlIkXb0DbvPmzfXcc8+pQ4cONic0z8WLF7V+/XodP35cqamp2Y7r1atXHqYyG/vMfbyf5dyyZcv+1uMjIyNzKQnyu3z3+Syv7/oIz5WUlGQVLlzYqlmzZqZtP/30k+VwOKx+/frZkMxc33zzjRUcHOy8s7KXl5fLHVt//PFHy8vLy5o8ebKNKc2RkZFhPf744y53or7tttus2267zeXu071797YyMjLsjmuM119/3QoMDLS8vLyyXbhztyv2mft4PwPMlN8+n3EpYeRYUFCQOnbsqOnTp2v9+vVq3Lixc9vkyZPlcDjUu3dvGxOaZdWqVerWrZuCg4M1fPhwtWjRItOlXGNiYhQSEqLZs2erR48eNiU1x0cffaQJEyYoNDRUr7/+urp27eq8xOb58+c1bdo0/fvf/9bkyZNVv359vfTSS/YGNsCwYcP09ttvy9vbW+3bt1e1atUyXeIbrthn7uP9zH2///67du/ererVq6t06dLO9fv379e//vUv/fbbb4qIiNAbb7zB5ffxt+S7z2d2tyN4lh9//NFyOBzWiy++6Fx34cIFKygoyKpevbqNycxz//33W76+vtaGDRuc6xwOh8tfGi3LsmJiYqyqVavmdTwj1axZ0ypSpIh14MCBbMccOHDAKlKkSJZ/ISqIqlSpYhUuXNjl5wzXxz5zH+9n7nvppZcsLy8va/fu3c51iYmJVpkyZVxmhwsXLmzt2bPHxqTID/LT5zPuEA+3tGnTRuXKldP06dOdJ+vNnTtXycnJHJf9FytXrlSzZs3UsGHD644rU6aMjh8/nkepzHbw4EHFxMSoYsWK2Y6pWLGiYmJiuIzw/0lISFBkZOQNf87w/7HP3Mf7mftiY2NVq1Ytl8u7TpgwQb///ru6du2q3bt3a8SIEUpJSdHw4cNtTIr8ID99PqOcwC0Oh0M9evTQqVOntHDhQklXpwy9vLw87of/Vrt48aJKlix5w3HXrkYFqWTJkjk6Wa9QoUIqUaJEHiQyX5kyZVSkSBG7Y3gU9pn7eD9z39GjR1WpUiWXdQsWLJCPj4/++9//qmrVqnrppZdUr169v33yPJCfPp9RTuC2Pn36yLIsTZo0Sb///rt+/vlnRUdHKywszO5oRilXrpy2b99+3TGWZem333677kxBQdKpUyf98ssv1/2Ac+bMGf3yyy/q2LFj3gUz2GOPPabY2FhduHDB7igeg33mPt7P3Hf+/HmXq5alp6dr1apVatSokcsfV2rUqKEjR47YERH5TH75fEY5gduqV6+uJk2a6Pvvv9fnn3+u9PR0zzrRKo+0a9dOu3fv1vTp07MdM3bsWCUkJKh9+/Z5mMxcb7/9tipVqqTWrVvrl19+ybR96dKlatOmjSpXrqx3333XhoTmGTJkiGrWrKkHH3xQ+/btszuOR2CfuY/3M/eFhoZq165dzq9XrFih5ORkRUVFuYxLS0vzjMu7wnj55fMZ9znBTfn888/1/PPPy8fHRwEBATpx4oQCAgLsjmWUI0eOqG7dukpOTtbLL7+sTp06qXnz5nr44Yc1aNAgzZkzR8OGDVNISIi2bdumUqVK2R05z7Vu3TrTutTUVK1atUoOh0PFihVz3lH58OHDOn36tCSpadOm8vf3z/ZuuPlZVvvs8uXLWrVqlby8vFS+fHmFhYVleQM4h8PBPvs/7DP38H7mvh49emjatGkaPny4YmJi9I9//EMrV65UXFycmjdv7hxXp04deXl5aevWrTam9Szz5s1TYmKiJO5D9Ff54fMZ5QQ35dy5cypbtqwuX76sPn36aNy4cXZHMtKqVavUpUsXnThxItPdzS3LUqlSpTRv3jzdeeedNiW0F3dQdh/7zH3ss9zB+5l7tm/friZNmjhv8GlZlqKjo13Kbnx8vCpVqqQnnnhCX375pV1RPU7NmjW1Z88eSeLf51/kh89n3OcEN6Vo0aJ68cUXtXbtWj399NN2xzFWs2bNtHv3bo0bN04//fST4uPjlZGRobCwMLVp00bPPPOMQkJC7I5pG6645T72mfvYZ7mD9zP31K5dWytWrNBHH32kU6dOqVGjRnrttddcxvz444+qV68e59C5qUmTJipTpozdMYyUHz6fMXMCAAAAwAicEA8AAADACJQTAAAAAEagnOCmpKamasiQIc4T/XBj7DP3sc/cxz5zH/vMfewz97HP3Mc+c19+2Gecc4KbkpSUpJCQECUmJio4ONjuOB6BfeY+9pn72GfuY5+5j33mPvaZ+9hn7ssP+4yZEwAAAABGoJwAAAAAMAL3OTFcRkaGjh07pqCgoEw3vbJTUlKSy39xY+wz97HP3Mc+cx/7zH3sM/exz9zHPnOfyfvMsiydP39eoaGh1705LuecGO7IkSMKDw+3OwYAAADwtyUkJCgsLCzb7cycGC4oKEiSVLhwiFEzJ6YrWrSU3RE8zjuTRtkdweM83a693RE8zpW0y3ZH8DiWlWF3BADINdc+22aHcmK4a4XE4XBQTtzg5eVtdwSPU7hIEbsjeBz+TbqPfeY+y2KfuY+DQtzHz5n7+Dm7GTf6PcAJ8QAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnt8CCBQvUt29f1axZU8HBwSpSpIjq1aund999V6mpqXbHAwAAAIzkY3eA/OiJJ55QSkqK6tSpo7p16yoxMVFr167Vv/71Ly1ZskSLFy+Wt7e33TEBAAAAo1BOboHRo0erbdu2CggIcK47f/68unXrpu+//15Tp05Vr169bEwIAAAAmIfDum6BDh06uBQTSQoKCtLIkSMlSfPmzcv2sampqUpKSnJZAAAAgIKAmZNbZO/evfrhhx+0b98+XbhwQRkZGbIsy7ktO0OHDtVbb72VVzEBAAAAY1BOcpllWXr11Vc1cuRIZxn5q/Pnz2f7+MGDB+uVV15xfp2UlKTw8PBczwkAAACYhsO6ctmMGTM0YsQIhYWFaebMmTp69KguX74sy7KcV+rKrrRIkp+fn4KDg10WAAAAoCBg5iSXzZkzR5I0atQotW/f3mXbgQMH7IgEAAAAeARmTnLZ2bNnJUlhYWGZtn3zzTd5HQcAAADwGJSTXFatWjVJ0pgxY1wO34qLi9MHH3xgVywAAADAeJSTXPbiiy+qSJEi+vzzz1WnTh117dpVrVq1UmRkpPr162d3PAAAAMBYlJNcVq1aNa1fv14PPPCATp06pfnz5ys5OVmjR49m5gQAAAC4Dk6IvwVq1Kih+fPnZ7ntelfqAgAAAAoyZk4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAERyWZVl2h0D2kpKSFBISYncMFAC8FbjP4eDvO+7j5wwACrLExEQFBwdnu53frAAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARjCinMTHx8vhcCgqKsruKAAAAABsYkQ5AQAAAADKCQAAAAAjUE4AAAAAGMG4cpKUlKT+/fsrPDxc/v7+qlmzpkaOHKmMjAyXcRUqVJDD4ZBlWfrkk09Ur149FS5cWPXr13eOOX36tF577TVVrVpV/v7+KlasmNq1a6fFixdnet0KFSrI399fly5dcln/0ksvyeFwKDw8PNNjHnroITkcDq1fvz5TLkkaO3as6tatq4CAAJUpU0bPPPOMzp079zf2DgAAAJCPWQY4ePCgJclq2rSp1ahRI6to0aJW586drfvvv98KCAiwJFm9e/d2eUz58uUtSdbTTz9tFSpUyLr77rutRx991OrUqZNlWZZ15MgRq1KlSpYkKyIiwnr00Uet1q1bW97e3pYka8SIES7P16tXL0uStXTpUpf1devWtSRZkqy9e/c612dkZFglSpSwQkJCrLS0tEy5XnvtNcvX19dq27at1alTJ6tUqVKWJKtly5ZWRkZGjvdNYmKi8/VZWG7lAvdJDha3F/t/1llYWFhY7FsSExOv/7s1j36HX9e1ciLJqlu3rnXy5Enntn379lmhoaGWJGvOnDnO9ddKQIkSJazffvst03Pef//9liSrW7duVmpqqnN9XFycVbhwYcvb29vatGmTc/348eMtSdabb77pXHf69GnL4XBYtWvXtiRZX375pXPb1q1bLUlW+/btXV73Wq4yZcpYu3btcq4/efKkVaVKFUuStWTJkhzvG8oJS14tcJ/9H/Q9cbH/Z52FhYWFxb7lRuXEuMO6PvzwQ5UoUcL5deXKlfX6669Lkj799NNM4//5z3+qdu3aLusOHDig77//XoGBgfrkk0/k6+vr3NaiRQv169dP6enp+uyzz5zrr13GODY21rlu2bJlsixLAwcOlJ+fn8u2a/8fGRmZ5ffxn//8R9WrV3d+XaJECfXr10+StHz58my//9TUVCUlJbksAAAAQEFgVDkpVqyY2rRpk2l9165dJUkrV67MdO7Jgw8+mGn8ihUrJEnt2rVTsWLFMm3v2bOnJCkuLs65rmLFioqIiNDq1aud551cKyDt2rVT06ZNtWzZMuf4a9uyuzdL27ZtM62rVq2aJOn48eNZPkaShg4dqpCQEOeS1bkuAAAAQH5kVDkpX758lutDQkJUtGhRpaSk6OzZsy7bIiIiMo0/duyYpKsnp2fl2vqjR4+6rI+MjFRqaqpWr14t6WoBqVWrlkqVKqWoqCgdOXJE+/btk2VZWr58uYKCgtSwYcMsXyMsLCzTuqCgIElXZ0eyM3jwYCUmJjqXhISEbMcCAAAA+YlR5eRm+Pv7u/2Ya1fT+qs/H9p15swZbdu2zbnuz9t+++03nTp1Si1atJC3t3eWz+XldXO71s/PT8HBwS4LAAAAUBD42B3gzw4fPpzl+qSkJJ07d04BAQEqWrToDZ8nNDRUknTo0KEst8fHx0uSypUr57L+2vkjsbGxqlevnizLcpaSpk2bOs87SUlJkZT9IV0AAAAA3GdUOTl9+rSWLFmimJgYl/XTp0+XJDVr1izbmYo/a9GihSRp0aJFOnfuXKZCM2XKFElSy5YtXdZXrlxZ4eHhWr16tapXry6Hw+EsIP7+/s7zTignAAAAQO4z7rCuV199VadPn3Z+ffDgQf373/+WJD333HM5eo5KlSqpffv2On/+vPr3768rV644t61atUqjRo2St7d3ls937byTSZMmqVatWipZsqRz27XzTn744Yfrnm8CAAAAwH1GlZOmTZvKy8tLVapUUZcuXfTggw+qTp06Onr0qHr06KHOnTvn+LlGjx6tihUratKkSapataq6du2qu+++Wy1bttSFCxc0bNgwl7vJX3Pt0K5Lly5lmhm59vWlS5d01113ycfHqIknAAAAwKMZVU78/Pz0yy+/qFu3blq9erV+/PFHhYeH68MPP9SECRPceq5y5cpp3bp1GjBggHx8fDR79mxt2LBBMTEx+vHHH/XKK69k+bg/F5K/lpNr551ktQ0AAADA3+O4epdjmCopKUkhISF2x0ABwFuB+xwOo/6+4yH4OQOAgiwxMfG6V6PlNysAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwgo/dAQCY4djZs3ZH8DhFi5ayO4LHOXfud7sjAAAMxswJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCd5pE+fPnI4HIqNjbU7CgAAAGAkygkAAAAAI1BOAAAAABiBcgIAAADACAWmnCxYsEB9+/ZVzZo1FRwcrCJFiqhevXp69913lZqa6jJ2woQJcjgcGjJkiA4fPqxu3bqpZMmSCggIUOPGjfXdd99l+zrjx49X/fr1FRAQoDJlyqhPnz46ceLErf72AAAAAI/nY3eAvPLEE08oJSVFderUUd26dZWYmKi1a9fqX//6l5YsWaLFixfL29vb5THx8fFq0qSJgoKCFBMTo8OHD2vVqlXq2LGjFi5cqLZt27qMHzRokN5//30VKlRI0dHRCgkJ0cKFC7V06VLVq1cvL79dAAAAwOMUmHIyevRotW3bVgEBAc5158+fV7du3fT9999r6tSp6tWrl8tjJk6cqAEDBmjYsGHy8ro6yfTf//5XL7/8st5++22XcrJ69WoNGzZMISEhWrp0qRo0aCBJSk5OVocOHa472wIAAACgAB3W1aFDB5diIklBQUEaOXKkJGnevHmZHlOxYkW9++67zmIiSc8//7xuu+02rV69WpcvX3auHzVqlCzLUv/+/Z3FRJICAwP1ySefyOFw5ChnamqqkpKSXBYAAACgICgwMyeStHfvXv3www/at2+fLly4oIyMDFmW5dz2V1FRUfL19XVZ5+Pjo4oVK2rjxo06ffq0ypYtK0mKi4uTJD322GOZnqdWrVqqV6+eNm/efMOMQ4cO1VtvveXutwYAAAB4vAJRTizL0quvvqqRI0c6y8hfnT9/PtO6sLCwLMcGBQVJksuJ9MeOHZMklS9fPsvHVKhQIUflZPDgwXrllVecXyclJSk8PPyGjwMAAAA8XYE4rGvGjBkaMWKEwsLCNHPmTB09elSXL1+WZVnOgpFVafnz4Vx5xc/PT8HBwS4LAAAAUBAUiHIyZ84cSVfPC+nSpYtCQ0NVqFAhSdKBAwdy5TWuHd516NChLLdntx4AAADAVQWinJw9e1ZS1odpffPNN7nyGi1btsz2+Xbt2pWjQ7oAAACAgqxAlJNq1apJksaMGeNy+FZcXJw++OCDXHmNfv36Sbp6qeEtW7Y411+4cEEvvPBCtue6AAAAALiqQJSTF198UUWKFNHnn3+uOnXqqGvXrmrVqpUiIyOdpeLvat68uV599VWdO3dOTZo0Ubt27fToo4+qcuXK2rNnjx544IFceR0AAAAgvyoQ5aRatWpav369HnjgAZ06dUrz589XcnKyRo8enWszJ5L0wQcf6Msvv1TNmjUVGxur2NhYtWnTRqtWrVKxYsVy7XUAAACA/MhhcbyR0ZKSkhQSEmJ3DBQAR8+csTuCx6ldqabdETzOuXO/2x0BAGCjxMTE616NtkDMnAAAAAAwH+UEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAj+NgdAIAZ6levb3cEjzN04gS7I3icL94YZncEj7Nly1K7I6AAcDj4e7W7LCvD7gj5Ej+JAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGKBDlxOFwqEKFCm49JioqSg6HQ/Hx8bckEwAAAABXBaKc5KabKToAAAAAbszH7gCmmjRpki5evKhy5crZHQUAAAAoECgn2YiIiLA7AgAAAFCgGH1Y16VLl+Tv75/lYVQdO3aUw+FQixYtMm1r3LixvLy8dPLkSZf16enpev/991WtWjX5+fkpPDxc//znP5WamprpOf56zsmECRPkcDgkSYcOHZLD4XAuUVFRLo+9ePGihg4dqgYNGigwMFCBgYFq2rSpJk6ceHM7AgAAACgAjJ458ff315133qnly5crPj7eWVIyMjK0fPlySdK6det08eJFFS5cWJKUmJioTZs2qVatWipZsqTL83Xr1k0//PCDoqKiVL16dcXFxWnYsGE6evSopkyZct0sVapUUe/evTVx4kQVKVJEDz30kHNbjRo1nP//xx9/qE2bNtq6davKlCmjyMhIWZallStXqk+fPlq/fr0++eST3Ng9AAAAQL5i9MyJJOesRGxsrHPdli1bdPbsWdWuXVuXL1/WypUrnduWL1+ujIyMTLMZhw4d0rZt27R371599913+u6777Rp0yYVLVpUU6dO1f79+6+bo0WLFpowYYIkqUSJEpowYYJzGTRokHPc448/rq1bt6p///6Kj4/XggUL9MMPP2j37t1q3LixPv30Uy1atOhv7RMAAAAgP/LIcnLt/994441st0VGRmZ6ro8//lhlypRxfl2xYkX16NFDkhQXF/e3s27evFk//PCDmjRpohEjRsjPz8+5rXTp0hozZowkadSoUdk+R2pqqpKSklwWAAAAoCAwvpw0bdpUfn5+mQpIUFCQunTpovLly2dZTv46c1KoUCFFR0dnev5q1apJko4fP/63sy5evFjS1fNhvLwy79pr56CsXbs22+cYOnSoQkJCnEt4ePjfzgUAAAB4AuPLSUBAgO644w4dOnRI8fHxysjIUFxcnFq2bClvb29FRUU5zztJTEzU5s2bszzfpEyZMvL29s70/EFBQZKU5Unx7rp28vy//vUvlxPm/7wkJyfr1KlT2T7H4MGDlZiY6FwSEhL+di4AAADAExh9Qvw1UVFRiouLU2xsrOrVq6ezZ886Z0aioqI0ceJErVy5UikpKcrIyMjykK6sZjJyW0ZGhqSr56dUrlz5pp7Dz8/P5XAwAAAAoKDwiHISGRmp//znP4qNjdXZs2clyaWcSFcP50pJSXFZl9fCwsIkXT2sa8CAAbZkAAAAADyV8Yd1SVLz5s3l6+ur2NhYxcbGKjg4WA0bNpQkVahQwXneyfVOhs8thQoVUlpaWpbb2rRpI0maM2fOLXt9AAAAIL/yiHLy5/NOFi9e7Dzf5JqoqCitXbtWmzdvVo0aNVS6dOlbliU0NFS///67zp07l2nbnXfeqTZt2ujXX3/Vc889l+WVtrZs2cKlhAEAAIAseEQ5kf7/bMilS5cyHbYVFRWlK1euZHl/k9z24IMPKi0tTQ0bNlSPHj305JNP6oMPPnBunzJliho0aKDPP/9c5cuXV3R0tLp37677779fERERql+/PuUEAAAAyILHlJM/l46sykl223Lb0KFD9fzzzystLU0zZszQuHHjtGDBAuf2UqVKaeXKlfr4449Vq1Ytbdq0STNnztTWrVtVqVIlffDBB3r11VdvaUYAAADAEzksy7LsDoHsJSUlKSQkxO4YKABKloywO4LH+ffY0XZH8DhfvDHM7ggeZ8uWpXZHQAHgcHjM36uNYVkZdkfwSImJiQoODs52Oz+JAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAg+dgcAYIakpFN2R/A4W5dvtTuCx6lTv7ndETzOrp2r7Y7gcdLSr9gdweNYlmV3BA/E3/jdcfVn7MY/Z+xVAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4kDRkyRA6HQxMmTLA7CgAAAFBgUU4AAAAAGIFyAgAAAMAIlBMAAAAARihQ5WT+/Plq1qyZChcurOLFi6tLly7as2dPtuMTEhL0zDPPqHz58vLz81OpUqXUuXNnrVu3LtvHzJ49W02bNlXhwoVVokQJPfzww9q3bx/ntQAAAAA3UGDKyRdffKEOHTpozZo1atKkidq0aaMNGzbojjvu0P79+zON37Ztmxo2bKgxY8YoICBAnTt3VtWqVTVnzhw1b95c3377babHfPTRR+rSpYvWrVunO++80+U1Dh48mBffJgAAAOCxfOwOkBcOHTqkl19+WYUKFdJ3332ne+65R5J05coVPf7445oyZYrLeMuy1L17d506dUoDBw7Ue++9J4fDIUmaNWuWHnnkEfXt21ctWrRQ2bJlJUkHDhzQwIED5evrq0WLFik6OlqSlJaWpqefflpfffVVHn7HAAAAgOcpEDMn48eP16VLl9S1a1dnMZGkQoUK6aOPPlLhwoVdxsfGxmrbtm2KiIjQ22+/7SwmktSlSxd17NhRycnJGj9+vMtrXL58WT179nQWE0ny8fHRiBEjFBgYmKOsqampSkpKclkAAACAgqBAlJO4uDhJ0mOPPZZpW/HixdW2bdssxz/yyCMqVKhQpsf07NnTZZwk/frrr5Kkhx9+ONP4okWLZnqN7AwdOlQhISHOJTw8PEePAwAAADxdgSgnx44dkySVL18+y+0VKlTIcvxf1/91/NGjR53rjh8/LknZlomIiIgcZR08eLASExOdS0JCQo4eBwAAAHi6AnHOSW7782Feuc3Pz09+fn637PkBAAAAUxWImZNrJ60fOnQoy+1/XR8aGnrd8fHx8ZKkcuXKZXqN7GY6mAEBAAAArq9AlJOWLVtKkr755ptM286cOaPFixdnOf7bb79Venp6psdcu7rXtXGSdNddd0m6ejWvv0pMTMz0GgAAAABcFYhy8vjjj8vPz09Tp07Vzz//7Fx/5coVvfzyy7pw4YLL+KioKN1+++2Kj4/XG2+8IcuynNvmzJmj2bNnKzAwUH379nV5DV9fX02aNEnLly93rk9PT9eAAQN0/vz5W/gdAgAAAJ6vQJSTihUravjw4bpy5YruueceRUdHq2vXrqpWrZrmzZun7t27u4x3OByaOnWqihcvrnfffVe1a9dWt27d1KJFC3Xu3FleXl4aN26c81AuSapcubKGDRum1NRURUdHq3Xr1s7XmDVrlnr06CFJ8vX1zdPvHQAAAPAUBaKcSNJzzz2nOXPmqEmTJlqzZo1+/PFH1atXT6tXr1aVKlUyjb/99tu1ceNGPfXUU0pOTtbMmTO1e/dudezYUb/++qseeeSRTI/p37+/Zs6cqcaNG2v16tX68ccfVb9+fa1Zs0b+/v6Srl66GAAAAEBmDuvPxyzhlkhPT1fdunW1c+dOHTt2TGXKlMnxY5OSkhQSEnIL0wFX+fkVvvEguOj7/Jt2R/A4Sae4say7Zk4bYXcEj5OWfsXuCB6Hj4PuY5+55+r+spSYmKjg4OBsxxWYmZO8sH//fp07d85lXWpqqgYOHKgdO3YoJibGrWICAAAAFCTc5yQXffvtt3rzzTfVqFEjhYeHKykpSVu2bNHx48dVokQJffrpp3ZHBAAAAIxFOclFMTEx2rJli1avXq2tW7cqLS1N5cqV07PPPqvBgwdne/d4AAAAAJSTXNWkSRNNmzbN7hgAAACAR+KcEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGcFiWZdkdAtlLSkpSSEiI3TEAZMHX19/uCB5nw/49dkfwOC3qNLI7gsdJTj5rdwSPk5GRYXcEj2NZ7LObkZiYqODg4Gy3M3MCAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGCEmyonH3/8sWrXri0/Pz85HA5FRUXlciz3xcbGyuFwqE+fPm49zuFwqEKFCrckEwAAAICc83H3AbNnz1b//v1122236cEHH1SRIkVUo0aNm3rxChUq6NChQ7Is66YeDwAAACD/cLuczJ07V5I0c+ZMtW7dOrfz5LmdO3eqUKFCdscAAAAACjy3y8mRI0ckSZUqVcr1MHa42VkfAAAAALkrx+ecDBkyRA6HQ0uXLpUkVaxYUQ6HQw6HQ7GxsZKktLQ0jRo1Ss2aNVNwcLACAgJUv359/fe//1VaWprzua6dH3Lo0CFJcj5PVud/XLlyRV988YVatGihokWLKiAgQFWqVNHjjz+uDRs2ZJn1zJkzevbZZ1W2bFn5+fmpTp06Gj9+fJZjs3rNP5+/4s5zSVcPe2vatKkKFy6sEiVK6OGHH9a+ffuc+2/ChAnX2csAAABAwZXjmZP69eurd+/eWrRokX7//Xd16dJFgYGBkqQyZcooJSVF7du319KlS1WsWDE1bdpU/v7+WrNmjV5++WUtXbpUc+bMkZeXl8qUKaPevXtr5syZunDhgnr37u18nRIlSjj//8KFC7rvvvu0fPlyFSlSxFlQ4uPjNXXqVIWEhKhRo0YuOc+dO6dmzZopOTlZLVu21KlTp7R8+XI98cQTysjI0JNPPpnjnePuc3300Ud66aWX5OXlpVatWqlMmTJas2aN7rjjDj3wwAM5fl0AAACgIHJYbp6NHhUVpWXLlungwYMuMw7PPfecPv/8cz366KMaPXq0QkJCJEnnz5/XY489ph9++EGjRo1Sv379nI+50QnxTz75pMaNG6dWrVpp5syZKlmypHPb77//rvj4eN15552Srs52REdHS5Iee+wxTZgwQX5+fpKunifTqVMnRUREOGdrnDvA4VD58uUVHx/vXHczz3XgwAHVrFlTkrRo0SLn49PS0vT000/rq6++kiR99dVXbl1RLCkpybkvAZjF19ff7ggeZ8P+PXZH8Dgt6jS68SC4SE4+a3cEj5ORkWF3BI9jWeyzm5GYmKjg4OBst+fKfU7++OMPffnllwoPD9dXX33l8mE6KChI48aNk6+vr0aNGpXj5zx27JizFEyaNMmlmEhS6dKlncXkz4KDg/Xpp586y4QkdezYUXXq1NHhw4ddSsiNuPNc48eP1+XLl9WzZ09nMZEkHx8fjRgxwjnLdCOpqalKSkpyWQAAAICCIFfKSWxsrK5cuaJ27dopICAg0/YyZcqoatWq2rZtm1JSUnL8nOnp6WrXrp3Kly+f4yyNGjVS8eLFM62vVq2aJOn48eO35Ll+/fVXSdLDDz+caXzRokXVtm3bHL3m0KFDFRIS4lzCw8NznBcAAADwZLlSTq7NIHz55ZcuJ7f/edm+fbssy9KZM2dy9JwJCQmSpMqVK7uVJSwsLMv1QUFBkq7OTNyK57pWVLIrExERETl6zcGDBysxMdG5XNsPAAAAQH7n9qWEs3LtOMX69eurXr161x3750OkbgUvr1zpW7n+XDnl5+d3y/cRAAAAYKJcKSfXZhhatGihTz75JDee0jkDsX///lx5vlutbNmy2r17txISElSrVq1M25kBAQAAAK4vV6YGoqOj5e3tre+//15XrlzJ8eN8fX0lyeUeKNdERUXJ29tbP/74o0d8sL/rrrskSbNmzcq0LTExUYsXL87rSAAAAIBHyZVyUq5cOfXt21fx8fHq2rWrfv/990xj9u3bl+mDe2hoqCRp9+7dmcaHhoaqV69eunTpknr37q3Tp0+7bP/jjz+0Zs2a3IifKx5//HH5+vpq0qRJWr58uXN9enq6BgwYoPPnz9uYDgAAADBfrhzWJV29AWF8fLxmzZqlRYsWqX79+oqIiNCFCxe0Y8cO7du3Tx06dFCXLl2cj3nwwQe1bNkyxcTEKDo6WkWKFFGJEiX03nvvOZ9z9+7dWrp0qcqXL69WrVopODhYhw4d0saNG/Xss89meTlhO1SuXFnDhg3TSy+9pOjoaEVGRqp06dJau3atzpw5ox49emjKlCnO2SIAAAAArnKtnAQEBGjhwoWaOnWqJk6cqM2bN2vt2rUqWbKkypcvr549e+qxxx5zecyLL76os2fPatq0aZo1a5auXLmi8uXLO8tJUFCQli5dqi+++EJTp05VXFyc0tPTFRoaqu7du6tXr165FT9X9O/fX2FhYRo2bJhWr14tf39/RUdHa+jQofrggw8kKctLEwMAAAC4iTvEw33p6emqW7eudu7cqWPHjqlMmTI5fix3iAfMxR3i3ccd4t3HHeLdxx3i3ccd4t3HHeJvTp7cIR5X7d+/X+fOnXNZl5qaqoEDB2rHjh2KiYlxq5gAAAAABUmuHdYF6dtvv9Wbb76pRo0aKTw8XElJSdqyZYuOHz+uEiVK6NNPP7U7IgAAAGAsykkuiomJ0ZYtW7R69Wpt3bpVaWlpKleunJ599lkNHjw427vHAwAAAKCc5KomTZpo2rRpdscAAAAAPBLnnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwgo/dAQDAU12+nGp3BI8z/4c4uyN4nOLFQ+2O4HEqVapvdwSPs23bMrsjeJy0tMt2R8iXmDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTm6BBQsWqG/fvqpZs6aCg4NVpEgR1atXT++++65SU1PtjgcAAAAYycfuAPnRE088oZSUFNWpU0d169ZVYmKi1q5dq3/9619asmSJFi9eLG9vb7tjAgAAAEahnNwCo0ePVtu2bRUQEOBcd/78eXXr1k3ff/+9pk6dql69etmYEAAAADAPh3XdAh06dHApJpIUFBSkkSNHSpLmzZuX7WNTU1OVlJTksgAAAAAFATMnt8jevXv1ww8/aN++fbpw4YIyMjJkWZZzW3aGDh2qt956K69iAgAAAMagnOQyy7L06quvauTIkc4y8lfnz5/P9vGDBw/WK6+84vw6KSlJ4eHhuZ4TAAAAMA2HdeWyGTNmaMSIEQoLC9PMmTN19OhRXb58WZZlOa/UlV1pkSQ/Pz8FBwe7LAAAAEBBwMxJLpszZ44kadSoUWrfvr3LtgMHDtgRCQAAAPAIzJzksrNnz0qSwsLCMm375ptv8joOAAAA4DEoJ7msWrVqkqQxY8a4HL4VFxenDz74wK5YAAAAgPEoJ7nsxRdfVJEiRfT555+rTp066tq1q1q1aqXIyEj169fP7ngAAACAsSgnuaxatWpav369HnjgAZ06dUrz589XcnKyRo8ezcwJAAAAcB2cEH8L1KhRQ/Pnz89y2/Wu1AUAAAAUZMycAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACM4LMuy7A6B7CUlJSkkJMTuGACy5LA7gMfx8wuwO4LHSU9PszuCx1m9Z5fdETxO28Z32R3B45w5c9zuCB4pMTFRwcHB2W5n5gQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGKNDlJD4+Xg6HQ1FRUXZHAQAAAAq8Al1OAAAAAJiDcgIAAADACAW2nAwZMkQVK1aUJC1btkwOh8O59OnTxzlux44d6t69u8qWLStfX1+VK1dOvXr10u7du12eb+bMmXI4HOrWrVu2r/n000/L4XDoq6++uiXfEwAAAODJHJZlWXaHsMPcuXM1ZcoUzZo1S6VLl1a7du2c21q0aKEnn3xSS5Ys0QMPPKCUlBQ1aNBA1atX165du7R582YFBgbqhx9+UMuWLSVJV65cUUREhM6ePaujR4+qePHiLq+XnJyssmXLysvLS8ePH1fhwoVzlDMpKUkhISG5940DyEUOuwN4HD+/ALsjeJz09DS7I3ic1Xt22R3B47RtfJfdETzOmTPH7Y7gkRITExUcHJzt9gI7c9KxY0d9+OGHkqQaNWpowoQJzuXJJ5/UhQsX1L17d6WkpOjTTz/Vxo0bNW3aNG3atEkjRoxQcnKyunXrpkuXLkmSChUqpL59+yo1NVWTJ0/O9HrTp09XcnKyunfvnuNiAgAAABQkBbac3Mg333yj33//Xc2aNdNzzz3nsu3ll19Wo0aNdOTIEc2aNcu5/umnn5aXl5e+/PLLTM83duxYSdJTTz113ddNTU1VUlKSywIAAAAUBJSTbMTFxUmSunfvnuX2Hj16uIyTpPLly6tdu3basWOHVq5c6Vy/bds2rVmzRo0bN1aDBg2u+7pDhw5VSEiIcwkPD/+73woAAADgESgn2Th27JgkqUKFClluv7b+6NGjLuv79esnSS6zJ9f+/0azJpI0ePBgJSYmOpeEhAR3owMAAAAeiXJykxyOrE+Eve+++xQeHq5vvvlGSUlJunTpkqZMmaLAwEB17dr1hs/r5+en4OBglwUAAAAoCCgn2QgNDZUkHTp0KMvt8fHxkqRy5cq5rPf29tZTTz2lixcvaurUqZo1a5bOnj2rxx57TEFBQbc0MwAAAODJCnQ58fX1lSSlpWW+TOO1SwRPmzYty8dOmTLFZdyfPfnkk/Lx8dGXX37p1iFdAAAAQEFWoMtJiRIlVKhQIe3fv1/p6eku2x555BGVLl1aK1as0JgxY1y2ffzxx1q/fr3KlSunLl26ZHresmXL6sEHH9SmTZu0bNky1a1bV3fcccct/V4AAAAAT1egy4mvr6/atWunEydOqF69eurVq5eefPJJffXVVypSpIimTp2qgIAAPfPMM2rcuLG6deumhg0bqn///goMDNS0adPk7++f5XNfOzFeunqJYQAAAADXV6DLiXT1/iM9e/bU6dOn9fXXX2vcuHFatmyZJCkmJkbr1q1T165ddeTIEc2cOVMnTpxQjx49tH79+iwP6bqmZcuWKlSokAICArK9HDEAAACA/8/H7gB2K1WqlCZNmpTt9tq1a+vrr792+3nnzJmjK1euqFu3bipatOjfSAgAAAAUDAV+5uRWuHLlit5//31JynR3eQAAAABZK/AzJ7lp/vz5mjt3rtauXavt27erY8eOatKkid2xAAAAAI/AzEku2rhxo7766isdO3ZM3bp107hx4+yOBAAAAHgMh2VZlt0hkL2kpCSFhITYHQNAlhx2B/A4fn4BdkfwOOnpme/FhetbvWeX3RE8TtvGd9kdweOcOXPc7ggeKTExUcHBwdluZ+YEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBF87A4AAJ7LsjuAx7GsDLsjeJy0tCt2R/A4j97d2e4IHmf6ssV2R/A4bW+va3cED5Oz35nMnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACP42B0ArlJTU5Wamur8OikpycY0AAAAQN5h5sQwQ4cOVUhIiHMJDw+3OxIAAACQJygnhhk8eLASExOdS0JCgt2RAAAAgDzBYV2G8fPzk5+fn90xAAAAgDzHzAkAAAAAI1BOAAAAABiBcpKHevXqpRo1amjOnDl2RwEAAACMQznJQ4cPH9bu3buVmJhodxQAAADAOJQTAAAAAEbgal15KDY21u4IAAAAgLGYOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABG8LE7AAB4LofdATxO0aKl7Y7gcc6ePWF3BI8THFzC7ggeZ+XSDXZH8DghIfycucOyMpSUdPqG45g5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYARjy8n+/ft1+PBhu2Nc16pVq3Tp0iW7YwAAAAD5glHlJCkpSWPHjlXLli1VpUoVbdy40WW7ZVmaNm2aWrdurdtuu03+/v6qWbOmhgwZoosXL2b5nKdPn9Zrr72mqlWryt/fX8WKFVO7du20ePHiLMcfOnRIzz77rKpVq6bChQurWLFiql27tp555hnt3r3bZezgwYNVpkwZPfPMM1q5cmXu7AQAAACggLK9nGRkZGjx4sXq3r27ypQpo6eeekq//vqrIiMjVaNGDZdx3bt3V7du3bRu3TrVr19f9913ny5cuKC33npL0dHRSklJcXnuo0eP6o477tCHH36oy5cvq2PHjmrQoIF+/vln3XPPPRo5cqTL+ISEBDVs2FBffPGFJOm+++5TZGSk/Pz89OWXX2rVqlUu4zt06KDChQtrzJgxuuuuu1StWjW98847xs/4AAAAACayrZzs2rVLgwcPVkREhO655x59/fXXioiI0Ntvv62DBw8qNjbWpZwMHz5c06ZNU1RUlPbu3aulS5dq9uzZ2rdvn5544gmtXbtWb731lstr9OvXTwcOHFC3bt20d+9eTZ8+XUuWLFFsbKwKFy6s1157TZs3b3aOHzt2rM6cOaPnn39ee/bs0cyZMzVnzhxt3LhR8fHxatmypcvzv/zyy0pISNCiRYvUrVs3HT16VP/7v/+rChUqKCYmRpMnT9aFCxdu6X4EAAAA8guHZVlWXr3Y2bNnNW3aNE2cOFFr166VJJUoUUKPPvqoevXqpTvuuCPLx6Wlpals2bJKSUnR/v37Vbp0aZftKSkpqlSpklJTU3Xq1Cl5eXnpwIEDqly5sgIDA3Xo0CEVK1bM5TEDBgzQiBEj9OSTT+rLL7+UJP3jH//QqFGjNHfuXHXo0MHt7+/8+fOaNWuWJk2apNjYWFmWpcDAQD300EPq3bu3IiMj5XA4rvscqampSk1NdX6dlJSk8PBwt7MAyAvX//eMzEqVirA7gsc5e/aE3RE8Tp3aLW88CC469O1hdwSPM/L11+yO4FEsK0NJSaeVmJio4ODgbMfl2czJP//5T5UtW1bPPfectmzZos6dO2vu3Lk6duyYPv3002yLiSRt3LhRp06dUvPmzTMVE0kKCAhQo0aNdPbsWe3du1eStGLFCklSu3btMhUTSerZs6ckKS4uzrmuUaNGkqT/+Z//0ffff+/2ye5BQUHq06ePfvnlFx06dEjvvPOOwsLCNGHCBEVHR6tSpUqZzqP5q6FDhyokJMS5UEwAAABQUORZOVmzZo1SU1Pl7e2t1157TZ999pk6dOigQoUK3fCx8fHxkqSffvpJDocjy2XBggWSpFOnTkmSjh07JkmqUKFCls95bf3Ro0ed6/r06aNHHnlEO3bs0AMPPKDbbrtNrVq10rvvvqsTJ9z7y1V4eLgGDx6sL774Qo0bN3Z+Hzc6H2Xw4MFKTEx0LgkJCW69LgAAAOCpfPLqhYYOHaoxY8Zo5syZevvttzV06FDdfffd6tmzpzp27KgiRYpk+9iMjAxJUpUqVXTXXXdd93WKFy+eozxZHV7l7e2tGTNmaNCgQZo3b55++eUXrVmzRnFxcXrvvfe0aNEiNW/e/IbPvWvXLk2ePFlTpkxxlpHatWs7D+26Hj8/P/n5+eXoewAAAADykzwrJ82aNVOzZs306aefatasWZo4caIWL16sH3/8UYGBgerUqZN69uypmJgYeXm5TuiEhYVJkmrUqKEJEybk6PVCQ0MlXb00cFauzcaUK1cu07YGDRqoQYMGGjJkiJKSkjRkyBCNHDlSL730kvNcmb/6448/NH36dE2ePFnr16+XdLUoPf/88+rdu7dz9gQAAABA1vL8al1FihRRr169tGTJEsXHx+s///mPypYtq8mTJ6tt27YKDw/Xa6+9pq1btzof06RJE4WEhGjZsmU6c+ZMjl6nRYsWkqRFixbp3LlzmbZPmTJFkjJdgeuvgoODNXToUDkcDv32228u21JSUjRjxgzdf//9KleunPr3768tW7bowQcf1KxZs3Ts2DF98sknFBMAAAAgB2y9z0lERIT+93//V3v27NGvv/6qp59+WhcvXtSHH36oevXqOc8j8fPz08CBA3X+/Hl17txZBw4cyPRcR48e1eTJk51fV6pUSe3bt9f58+fVv39/Xblyxblt1apVGjVqlLy9vfXcc88510+ePDlTAZGkhQsXyrKsTCenP/jgg3rssce0YMEC3X777frvf/+ro0ePat68eercubN8fX3/9j4CAAAACoo8O6zrRpo3b67mzZvro48+0ty5czVx4kT9+SrHgwYNcp7LUbNmTTVo0EAVK1bU5cuXtXv3bu3YsUN169Z1XoVLkkaPHq2WLVtq0qRJWrZsmZo1a6aTJ08qNjZW6enpGj58uOrXr+8cP2vWLPXq1UuVK1fW7bffroCAAB08eFBr1qyRl5eX3n77bZfMxYsX1yuvvKI+ffro9ttvv+X7CAAAAMjP8vQ+J7lh/vz5GjNmjNatW6ezZ8/qtttuU3h4uGJiYvToo4+qYcOGLuNPnz6toUOHau7cuUpISFDhwoV1xx13aMCAAWrbtq3L2OXLl+ubb77Rr7/+qoSEBF24cEGhoaHO8XYcnpWUlKSQkJA8f10AOcF9TtzFfU7cx31O3Md9TtzHfU7cx31O3JPT+5x4XDkpaCgngMkoJ+6inLiPcuI+yon7KCfuo5y4x7ibMAIAAADA9VBOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBEoJwAAAACMQDkBAAAAYATKCQAAAAAjUE4AAAAAGIFyAgAAAMAIlBMAAAAARqCcAAAAADAC5QQAAACAESgnAAAAAIxAOQEAAABgBMoJAAAAACNQTgAAAAAYgXICAAAAwAiUEwAAAABGoJwAAAAAMALlBAAAAIARKCcAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEbwsTsArs+yLLsjAMgW/z7dlZGRYXcEj8PvAfelp6fZHcHjXEpJsTuCx7Es3s/ccW1/3eg9zWHxrme0I0eOKDw83O4YAAAAwN+WkJCgsLCwbLdTTgyXkZGhY8eOKSgoSA6Hw+44TklJSQoPD1dCQoKCg4PtjuMR2GfuY5+5j33mPvaZ+9hn7mOfuY995j6T95llWTp//rxCQ0Pl5ZX9mSUc1mU4Ly+v67ZLuwUHBxv3w2869pn72GfuY5+5j33mPvaZ+9hn7mOfuc/UfRYSEnLDMZwQDwAAAMAIlBMAAAAARqCc4Kb4+fnpzTfflJ+fn91RPAb7zH3sM/exz9zHPnMf+8x97DP3sc/clx/2GSfEAwAAADACMycAAAAAjEA5AQAAAGAEygkAAAAAI1BOAAAAABiBcgIAAADACJQTAAAAAEagnAAAAAAwAuUEAAAAgBH+Hw6etwhkAtYmAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x1000 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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q1cvzZo1S7/++qvKlCljd8xMky9fPq1fv15Xr15Nc56rV69q/fr1yps3rxuTwZ02bdqkqKgotW3bVgEBAS6vderUSdmyZTP2YAYXMHm49PYkvPjii5o5c6b69+9vUzq4y+HDhxUZGZnu6GgOh0NvvPGGm5MBmePGjRvq2LGjFi9erOzZs6tChQopTnOqWrWqOnbsqJo1a+q1116zKSkyW48ePTRy5EidO3fujo6yeCofHx+1adPGKy+FaNeuncaMGaOOHTvqiy++UMmSJV1ej46O1vPPP6+TJ0/queeesyckMt2UKVPkcDhcDmLcUrBgQbVs2VLfffeddu/erYoVK9qQMG1cw+bBNm3apPr166tLly7OI223nD59WiEhIapatap+/vlnmxIisyUlJemZZ57RjBkzJCndIYsdDodu3LjhrmhApvr000/10ksv6eGHH9bEiRNVuHBh+fj4qGfPnpo0aZJzvvDwcBUqVEg//vijjWmRmW7cuKEOHTro8OHD+vTTT9W4cWM5HA67Y8GNzp8/r/r162vv3r3y9fVVrVq1VKJECUnSkSNHtG3bNl2/fl3ly5fXhg0bOMrmgRITE1WkSBEFBAQoJiYm1X8DZs+erU6dOmnQoEEaMWKEDSnTxhE2D5aV9yQgY7z55puaPn268uTJo65duyo8PNxjr1EA/mzy5MkqXLiwZs+eneLUlz+79957tW3bNjcmg7v5+vpq3LhxatasmZo1a6bs2bOrSJEi8vFJeVWIJ940ef369Xc0X44cOZQ/f36VKVPG4wpt3rx5tXHjRg0ZMkRTp07VTz/9pJ9++sn5ur+/v3r16qXhw4dT1jzUL7/8omrVqqlNmzZp/n63adNGzZo107Fjx9yc7vY4wuahsvqeBGSM4sWL69KlS/rll1+cexMBb5ArVy61bNlSCxcudE5L7Qhbly5dNG/evHSvbUHWtmfPHjVp0kSnT5++oxsje9p9uHx8fO6qgAUGBqpTp056//33jRwt75+6cuWKtm3bpuPHj0uSihYtqpo1a6a7YwewG0fYPFRW35OAjHHq1Ck98MADlDV4nezZs99RCTt69ChHnT3cyy+/rFOnTqlnz5566aWXVLp0aa/6ct69e3dduHBBixcvlo+Pj6pVq6bixYtLujmS9C+//CLLsvTII48oISFBO3bs0Pjx4/XDDz/op59+8rgjTrly5VLDhg3tjgHcFY6wAR6sXLlyKl++vBYtWmR3FMCt6tWrp6ioKB06dMhZyP56hO3UqVO65557dP/992vlypV2xkUmCg4OVqlSpbRjxw67o9ji9OnTuu+++1SuXDl99tlnKlu2rMvrBw4c0AsvvKC9e/dq8+bNCggIUO/evTV79mz9+9//1rBhw2xKDuAWhvUHPFivXr20du1anT592u4ogFt169ZNZ8+eVd++fZWUlJTi9Rs3bqhfv366cuWKevToYUNCuEuOHDl077332h3DNkOGDFFiYqIWLFiQoqxJUpkyZTRv3jwlJiZqyJAhCggI0Jdffqm8efNq8eLFNiTOHImJiZo8ebJ69eqlhx56SE2bNk310axZM7ujIpNERUVp6tSpKe61t3nzZt1///0KDAzUvffeq/nz59uUMG0cYQM8WHJysjp37qxdu3bp888/V0REhMddTA6k5saNG2rRooXWrl2rEiVK6IEHHnDek61BgwZaunSpDh8+7Bx8ie3Ccz3++OP6/ffftWvXLruj2KJo0aKKiIi47Q2Bn3zySa1bt04nTpyQJLVo0UIbN27U5cuX3REzU8XGxqpZs2aKioq67XWMjJjsufr27asJEyYoOjpaoaGhkqQ//vhD4eHhunjxohwOhyzLkq+vr3766SfVqFHD5sT/jyNsHiwr70lAxihTpoy2bNmiPXv2qHnz5vL391fJkiVVunTpFI977rnH7rhAhvH19dXy5cv13HPP6fjx4xo/frykm9f3fv755zp69Kh69+6thQsXUtY83AcffKCTJ0/q9ddf98ov4nFxcYqLi7vtfPHx8S7zFShQIDNjudUrr7yi/fv3q27dupo7d6527typw4cPp/o4dOiQ3XGRSX788UdVq1bNWdYkadKkSbp48aIGDhyohIQEzZ8/X8nJyRo1apSNSVPiCJsHy8p7EpAxUhu2Oj2eNjoaIN28hmft2rWKjo5WcnKyQkND1aRJExUrVszuaHCDd955R4cOHdK0adNUunRpRUREKCQkJM1h/d944w0bUmaeqlWrav/+/dq+fbsqVKiQ6jx79uxRjRo1VK5cOee1fhERETp8+LCOHDnixrSZI3/+/MqdO7f27t2rnDlz2h0HNsmfP78iIiI0b94857TGjRtry5YtOn36tAIDAyXdvAb69OnTioqKsitqCowS6cFutydh2LBhWr58uTp06KBRo0Zp+vTpNqZFZqCAATfvO/nYY4/ZHQM2GTp0qHMH5cGDB9O9z5onFrZ+/fqpb9++atSokQYOHKiOHTsqLCxM0s1RIufNm6dRo0YpKSlJ/fr1kyQlJCRo27ZtatGihZ3RM0xiYqKaN29OWfNyV69ela+vr/N5YmKifv75Z913333OsiZJpUqV0q+//mpHxDRR2DzYiRMnFBER4TLt+++/l5+fn4YOHaocOXKobdu2uu+++1xuIAkAgKf4+uuv7Y5gq2effVZ79uzRp59+qtdff12vv/56inksy9KLL76o3r17S5KOHDmirl27qkOHDu6OmykqV66sM2fO2B0DNgsNDdXOnTudz1etWqWrV6+qadOmLvMlJCQYd+sPTon0YAEBAWrVqpW+/fZbSTf3JOTNm1d16tTR2rVrnfN16dJFCxcu9IgLiwFAunka3J3IkSOH8ufPr2rVqql27dqZnAqwz4YNGzR27Fht3LjRObBI0aJFVb9+ffXp00cNGjSwOWHmWbhwoR577DFt2LBBderUsTsObPLcc89p/Pjxev7559WsWTMNGTJEe/bs0fbt21W1alXnfGXLllVQUJC2bdtmY1pXHGHzYFl5TwIy1pUrV7R161adOHFCiYmJac7XvXt3N6YCMs+t0+D+7Nb+yT9PtyzL+bxcuXKaMGGC6tWr576ggJvUr19f9evXtzuGLWrUqKGBAweqWbNmGjhwoFq0aKHQ0NA0r/O+dWNxeJYhQ4bo22+/1eeff67PP/9clmXpiSeecClru3fv1sGDB9W/f38bk6bEETYPlpX3JCDjvPnmmxo9erSuXLmS5jy3vrR64whq8ExTpkzRTz/9pC+//FIlSpRQhw4dnF/Cbl23Ex0drT59+igsLEzr16/XihUrFBAQoJ9//lnly5e3eQmQ0a5fv65ly5Zpy5YtOnPmjO677z716tVLknT8+HGdOXNG9957r7JlY1+2p/Hx8XFex3i7UWEdDoeuX7/upmRwt2PHjmnChAk6ffq0atasqZ49e7oU9+nTp2vevHl6+eWXjTrqTGHzYEePHlX16tV14cIFSXLuSfjzvVh2796typUrq3///vrss89sSorMMmLECA0ePFi+vr566KGHFB4erty5c6c5/1tvveXGdEDm2bZtmxo2bKhXX31Vb7zxhsuF5tLNAXneffddffDBB4qMjFStWrU0evRovfzyy+rRo4fXX/fkaX788Ud17dpVMTExzi/tPXr00KRJkyRJ8+bN0+OPP645c+aoffv2NqdFRrvbe5CuWbMmE9MAd4/C5uGy6p4EZIyyZcvq+PHjioyM5LYN8CqtWrVSTEyMy2nhqalSpYpCQ0O1fPlyWZale+65R8nJyYqOjnZPUGS633//XXXq1NG1a9f03HPPqUGDBnr88cfVs2dPZ2FLSkpS/vz51bp1a82YMcPmxP9M6dKl5XA4tGrVKpUqVUqlS5e+4/c6HI50R9EEYA+O+3u40NBQDR06NM3Xu3btqq5du7ovENwqJiZGTZs2pazB62zatEkPPfTQbeerXLmyli9fLunml9VKlSppxYoVmR0PbvTuu+/q6tWrWr58uVq2bJnqPDly5FCNGjX0yy+/uDldxru1s+HatWsuzwHctHPnTv33v/9VZGSkYmNjJUkhISFq1KiR/vWvf6lKlSo2J0yJwgZ4sCJFijCgDLzS9evX7+iLanR0tMu1m35+ftyrycOsWbNGderUSbOs3RISEmLcvZf+jr/ef5P7cQL/79NPP9Urr7yiGzdu6M8nGe7du1d79+7VpEmT9NFHH2nAgAE2pkyJwuYFsuKeBGSMJ598UhMnTtTly5cpbvAqtWrV0rp16zR79mw98cQTqc4ze/Zsbdq0SU2aNHFOO3LkiAoXLuyumHCDCxcuOG8UnZ7Lly87j0rBM125ckVr1qxRVFSULl68qNSuCvLEm6fjppUrV+qll15Srly51LdvX3Xr1k0lS5aUw+FQdHS0pk2bpi+//FIDBw5UpUqV1KxZM7sjO3ENm4dLa0/CLdmyZTNyTwIyxtWrV9WyZUtlz55d48aNU5kyZeyOlKlujfj2dzgcDk2cODED08BO69atU/PmzZWcnKzmzZurY8eOzi/tt0aJXLlypXx9fbVq1So1atRIp06dUkhIiHr06KEJEybYvATIKMWLF1fBggVdRkL28fFxuYZNksLDw+Xj46O9e/faEROZbPLkyXrppZcUHx/vnPbXUSMZMdmzPfTQQ1q9erXWrl2b5u1bNm3apEaNGqlFixbO0+VNQGHzYCtXrtQDDzxw2z0JV65c0YoVK4zak4CM0bRpUyUlJWnTpk3y8fFRiRIl0rz3jMPh0OrVq21ImXHSuqfOrT/If/3n7s/T+SPteebPn6/evXvr/Pnzqd6TLV++fPrqq6/Url07SXIO0FOzZk2P37nhTXr27Klp06Zp1apVzqOpfy1sCxYsUIcOHdSvXz99/vnndsbNcFFRUdq0aZMaNmyoUqVKOadv3rxZL774onbt2qXixYvrvffe89gRMletWqUHHnhAwcHB6tevn9asWaNNmzbpyy+/1MGDB7VgwQJFRUWpf//+qlmzpnr06GF3ZGSC/Pnzq0aNGlq5cmW687Vo0ULbt2/X2bNn3ZTs9ihsHiwr70lAxkirwKTGEwrLunXrUkybM2eOxowZo/vuu0+dOnVSyZIlJd089W3mzJnavHmz+vXrp44dO6px48ZuTozMdvHiRX377bfasGGDTpw4IUkqWrSo6tevr8cee0xBQUE2J0Rm27t3r6pXr64cOXLogw8+ULt27VSsWDH17NlTH3/8sRYsWKBBgwbp2rVr2rlzp0up8QR9+/bVhAkTFB0drdDQUEnSH3/8ofDwcF28eNF5fzJfX1/99NNPHjlI1UMPPaSVK1dq27Ztqlq1qp566ilNnTrV+Tfv+vXrevXVVzV+/Hht3rxZlSpVsjkxMoO/v7/atWunb775Jt35OnfurAULFighIcFNyW6PwubBsvKeBGSMI0eO3NX8JUqUyKQk9vjf//6nVq1a6YsvvlDfvn1TnWfcuHHq16+fli5dqgcffNDNCQG4w8KFC9WtWzdduXIl1ddz5sypmTNnqnXr1m5OlvkqVaqknDlzauvWrc5pw4cP12uvvaaBAwdq2LBhWr58uTp06KBOnTpp+vTpNqbNHAUKFFD58uX1448/SlKKwibdHJylTJkyql69uubNm2dXVGSi8PBwXbt2TVFRUcqWLfVhPK5fv66yZcsqe/bs2r9/v5sTpu3Od78jy7ly5YoKFix42/kKFiyY5h8xZG0lSpS4q4enef/991WjRo00y5ok9enTRzVr1tR7773nxmRA5ujVq5fLdVlHjx7VuXPnbExkhrZt22rXrl16/vnnVb58eeXMmVM5cuRQ6dKl1adPH+3cudMjy5oknThxIsW/799//738/Pw0dOhQ5ciRQ23bttV9992nn376yaaUmevSpUsqXry487mfn5+km0fgb/Hx8dF9992nyMhIt+eDe7Rp00ZHjhxRr169dOHChRSvx8fHq3fv3jp69Kjatm3r9nzpYZRIDxYWFqZNmzbp+vXr6e5J2LRp0x2NoAVkNTt27NCjjz562/nKlCmjJUuWuCER3O3KlSvaunWrTpw4ocTExDTn6969uxtTZZ7JkydL+v8BeEqVKqWePXsyoI5u7sD65JNP7I7hdlevXpWvr6/zeWJion7++Wfdd999CgwMdE4vVaqUR9zWIDVFihRx2XFRtGhRSdL+/ftVs2ZN5/Rz584ZdRocMtaQIUM0f/58zZgxQ4sWLdKDDz7ocpnE999/r/j4eJUuXVpDhgyxN+xfUNg8WJs2bfTxxx+rV69e+uyzz5QnTx6X1+Pj4zVgwAAdPXpUL7/8sj0h4VYXLlxIcyhjSS57ID1BtmzZtGvXrtvOt2vXrjR3aiDrevPNNzV69Oh0zyC4NeCMpxS27Nmz6+rVq87nlmWlub3DO4SGhmrnzp3O56tWrdLVq1fVtGlTl/kSEhI89vYv5cuXV1RUlPN5vXr1ZFmWRowYoVmzZsnhcGjjxo364YcfVLVqVRuTIjPly5dPkZGR6tOnj5YtW6Y5c+akmKdVq1YaN26c8ubNa0PCtPENxYNl5T0JGen69es6e/ZsunvXPa2o/NnJkyf1+uuva/Hixelep+hwOHT9+nU3Jst8jRo10pIlS/TOO+/ojTfeSDFSoCS9++67+u233zz2dKhbvG07GDFihN577z35+vqqVatWCg8PV+7cue2OlenCwsIUGRmpI0eOeORpzv+Ut20H0s3RgsePH68XX3xRzZo105AhQ+RwONSmTRuX+X777TePPdumVatWGjBggLZs2aI6deqoWbNmqlKliubOnauQkBAVLVpUu3btUnJysl588UW74yITFStWTEuWLNHhw4f1448/6vjx487pDRo0MHfQIQseLTY21nrkkUcsh8OR6uORRx6xYmNj7Y6ZKVauXGk1btzY8vPzs3x8fNJ8+Pr62h010xw/ftwKCQmxHA6HFRoaahUuXNhyOBxWvXr1rCJFilgOh8Py8fGx6tevb0VERNgdN8Pt3r3byp07t+Xj42OVKVPGGjx4sDV27Fhr7Nix1uDBg62yZctaPj4+Vu7cua1du3bZHTdTeOt2UKZMGStXrlzWtm3b7I7iVm+88YZzu/bx8XH5/7d7eNrvwJ9563ZgWZZ15MgRK1++fC6/E08++aTLPLt27bIcDof1/PPP25Qyc124cMH6/vvvrejoaOe0Y8eOWQ888IDl6+trORwOK0+ePNawYcNsTAmkjVEivUSW25PwDy1dulTt2rXTjRs3lDdvXpUqVSrdvetr1qxxYzr36devn8aOHat33nlHr7/+eoqRsdavX6/nnntO+fLl08qVK5UzZ06bE2e8rVu3qkePHtqzZ4+klPdkK1++vCZPnqw6derYljGzePN2kDNnTjVt2tTrbleSnJysTz75RIsWLdKxY8d0+PBhBQQEqECBAnf0/sOHD2dyQvfz5u3glmPHjmnChAk6ffq0atasqZ49e7rc9mX69OmaN2+eXn75ZTVo0MDGpO535coVxcXFqVChQi7X+sHzRUVF6cyZM8qfP7/Cw8PtjpMuChs8Uu3atbV9+3aNGjVK/fv399p/hO+55x5J0sGDByWlPpRxbGysypUrpwEDBuj999+3Jac7rF27VpGRkc6dFkWLFlXDhg0VERGR6qmSnsCbt4OSJUuqdu3aqV6j4E3+eoNob+TN2wFuGjhwoPLmzas33njD7iiwWWJiot5++22NHz9e58+flyT16NHD+W/k9OnTNWrUKE2aNEnVqlWzMakrrmHzUnv27NHu3bsVFham++67z+44GW737t2qW7euBgwYYHcUW8XGxqpVq1bO57e+qCQmJjqHNQ4JCVGTJk307bffenRhi4iIUEREhN0x3Mqbt4Mnn3xSEydO1OXLlz12IIU70aNHD687YvJX3rwd4KYvvvgixTV78D4JCQlq2rSptmzZosKFC+vhhx/WsmXLXOZp2rSpevTooW+//ZbCBveYPXu2xo0bp+HDh7uUskGDBmn06NHO561bt9bcuXM9aq9jYGCgx104/ncEBQW5PL81UmhsbKxKly7tnJ4zZ07Fxsa6MxrcwJu3g6FDh2rjxo1q3bq1xo0bpzJlytgdyRZff/213RFs523bwdGjR//R+z1xXYWGhio5OdnuGLDZiBEj9NNPP+npp5/W559/rpw5c7qcGizdvGTo3nvv1apVqzRs2DCbkqZEYfNg06dP144dO1S9enXntI0bN2rUqFEKCgpSq1attHnzZi1evFgzZszwmGGtJal58+baunWr3TFsV7x4cZc/3pUqVZIkLV++XP3795d08/z9DRs2OO9L44kOHz6syMjIdO/F5XA4PO50GW/eDh5++GElJydr7dq1qlChgkqUKKHQ0NAUf5ylm//tV69e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uN16yuq8eTuQbo6Gt3z5cr388suaMGGCxo8fL+nmEeZffvlFvr6+6t27tz799FOPHHRFkoYPH679+/frjz/+cLmF0cGDB/Xaa69p165dKl68uN544w3VrVvXxqTITFn5ezGFzcP16NFDM2fO1LRp05y/mFeuXNGCBQtUtmxZjzpf/c+GDRsmHx8frVy5UjVq1Eh1Hl9fX9WoUUO7du1yczr3eeutt2RZlr7++us0y4sn+/M1DKk5f/68evfurV27dmnTpk3uCeVG3rwdfP3112m+dmuwjdq1a9925Lys7uOPP9bq1av16KOPatSoUXrnnXc0ffp0Xb16VYcOHdLs2bM1cuRIPffccx478Iq3bQe3Tv+7dbrn+vXrVaRIEf33v//V0KFDtXbtWpd7TzVp0kTFihWzOXXm+vDDD/XZZ59pz549zsIWHx+vBg0a6NSpU7IsS7///rvWrVunHTt2qGzZsjYnRmbJst+LLXi05ORkKzQ01CpUqJB1/fp1y7Isa8aMGZbD4bDef/99m9Nlnnz58lmNGzd2meZwOKynnnrKZVqXLl2swMBANyZzL39/f6tp06Z2xzDa5cuXrSJFilh9+vSxO0qGYztA1apVrfz581uXLl2yLMuyevbsafn4+LjMs379esvX19eaOHGiHREznbdtB39dNofDYfXq1cvGRParVq2aValSJZdpn376qeVwOKwuXbpY+/fvt0aPHm05HA6P/FuA/5dVvxdzd0AP53A41LVrV505c8Z5c9hp06bJx8dH3bt3tzld5rly5YoKFix42/nOnz/vhjT2KVCggAoUKGB3DKPlypVLderU0eLFi+2OkuHYDnDgwAHVqVPHeSTx1oBDf75es2HDhqpfv77GjBljS8bM5m3bQY4cOXT58mWXaZYHn/J6J2JjY1PcumLZsmXKli2bPvnkE5UtW1YvvviiqlatqnXr1tmUEu6QVb8Xc0qkF+jZs6c+/PBDTZ06VbVr19aqVavUpEkThYaG2h0t04SEhGj37t3pzmNZlnbt2qVSpUq5KZX7dezYUTNnztTVq1eVM2dOu+MY69KlSx7zZe3PvGk7KF26tBwOh1atWqVSpUrd1X3FHA6HcuXKpXvuuUddu3ZVx44dMzGpe/n6+io4ONj5/FZxO336tIoUKeKcHhISoiVLlrg9nzt403YgSWXKlNHq1au1bt06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AAAAAEM5LMuy7A7hDeLj4xUcHGx3DMB2fjn87Y4Am4WEhtsdwVbvzxhrdwTbdW3QyO4Itsrmm93uCLZLtpLtjmC7wMC8dkewVULCJbsj2MqyLCUmXlZcXJyCgoLSnZcjbAAAAABgKAobAAAAABiKwgYAAAAAhqKwAQAAAIChKGwAAAAAYCgKGwAAAAAYisIGAAAAAIaisAEAAACAoShsAAAAAGAoChsAAAAAGIrCBgAAAACGorABAAAAgKEobAAAAABgKAobAAAAABiKwgYAAAAAhqKwAQAAAIChKGwAAAAAYCgKGwAAAAAYisIGAAAAAIaisAEAAACAoShsAAAAAGAoChsAAAAAGIrCBgAAAACGorABAAAAgKGyZGGLjo6Ww+FQRESE3VEAAAAAINNkycIGAAAAAN6AwgYAAAAAhqKwAQAAAIChsnxhi4+P14ABAxQWFqacOXOqQoUKGj16tJKTk1PMGxMToz59+qhEiRLy8/NToUKF1L59e/38888u823dulUOh0P16tVL83OHDRsmh8Oht956K8OXCQAAAACkLF7YEhMT1bRpU02dOlV16tRRixYtdOTIEQ0cOFC9evVymfe3335TjRo1NH78ePn7+6t9+/YqW7asFixYoHr16mnOnDnOeWvVqqUaNWpo06ZN2r17d4rPtSxLEydOlI+Pj55++ulMX04AAAAA3ilLF7bNmzfr2rVrioqK0rx587RkyRL99ttvKlasmKZMmaKFCxdKulmwunTpojNnzujVV1/Vnj17NHPmTG3YsEFz585VcnKyevXqpRMnTjh/dt++fSVJX331VYrPXb16tQ4dOqQHHnhAxYsXd8uyAgAAAPA+WbqwSdLIkSNVoEAB5/N77rlHb7zxhiTpiy++kCStXbtWv/32m4oXL6733ntPDofDOX+HDh3Utm1bXbp0SZMmTXJO79y5s4KCgjRt2jQlJia6fOaECRMkSb17904zV2JiouLj410eAAAAAHA3snRhy5cvn1q0aJFieqdOnSRJGzduVHJysiIjIyVJjz/+uLJnz55i/m7dukmScz5JCggIUNeuXXXu3DnNmzfPOf3MmTNasGCBihQpokcffTTNbMOHD1dwcLDzERYW9vcWEgAAAIDXytKFrUSJEqlODw4OVp48eZSQkKDz58/r+PHjkqSSJUumOv+t6bGxsS7TUzstcurU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k5NTzHvlyhUNHz5c1atXV2BgoAIDA3X//fdrypQpqf7syMhI9e/fX1WqVFHevHnl7++v8uXLa/Dgwbpw4UKamfbs2aOnn35aJUuWlJ+fnwoVKqT69etr5MiRun79eqrvWbhwoe6//34FBAQoX7586tSpk44dO/a31gkAAAAA3KlMK2yJiYlq2rSppk6dqjp16qhFixY6cuSIBg4cqF69ernMe+rUKdWtW1f/+c9/dPLkSTVu3FiNGjXS3r171bNnTz3//PMpfv4rr7yiiRMnyt/fX82aNVOzZs0UHx+vDz/8UA0aNNClS5dSvGfOnDmqXr26Jk2apFy5cqldu3aqWbOmYmJi9Morr6T6njFjxqhjx47y9/fXww8/rMDAQM2aNUtNmzZVQkJCxq0wAAAAAPiLbJn1gzdv3qwqVaooKipKBQoUkCQdPHhQjRo10pQpU9S2bVu1bdtWkvTUU09p586dGjBggD788EP5+flJkv744w898sgj+uKLL9SqVSs9+OCDzp//1ltvqV69egoODnZOS0xM1AsvvKDx48dr1KhRevPNN52vRUVFqXv37rpx44ZmzJihzp07O1+zLEsrV66Uv79/iuX473//q8jISNWtW1fSzSOBLVq00MaNGzVz5swU5RMAAAAAMkqmnhI5cuRIZ1mTpHvuuUdvvPGGJOmLL76QJO3YsUPLly9X7dq1NWrUKGdZk6TChQtr/PjxkqSxY8e6/OyHHnrIpaxJkp+fnz755BNly5ZNixYtcnlt9OjRunr1qp555hmXsiZJDodDLVu2dPnsW1566SVnWZOkXLlyaeDAgZKk9evXp7nsiYmJio+Pd3kAAAAAwN3ItCNs+fLlU4sWLVJM79Spk5577jlt3LhRycnJWrFihSSpbdu28vFJ2R9vXdO2ZcuWFK/FxsZqyZIl2rt3r+Lj453XxuXIkUNRUVEu865atUqS1KdPn7tajpYtW6aYFh4eLkk6ceJEmu8bPny43n777bv6LAAAAAD4s0wrbCVKlEh1enBwsPLkyaMLFy7o/PnzzhtTv/baa3rttdfS/HlXr151eT5q1CgNHjxY165du6M8MTExkm4e5bsboaGhKablzp1b0s2jaGkZMmSI80icdHMAlrCwsLv6bAAAAADeLdMK2526dVSsQYMGd1ymNm/erJdfflnBwcH69NNPFRERoSJFijhP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8rplWZo5c6aaNm2qvHnzKmfOnKpQoYKGDh2qK1eupPozz549q1deeUVly5ZVzpw5lS9fPj344INasWJFqvMfOXJEzz33nMLDw5UrVy7ly5dPFStWVJ8+fbRv3z6XeYcMGaIiRYqoT58+2rhxY8asBAAAAAD4hzKssCUnJ2vFihXq0qWLihQpot69e2vDhg1q3Lixypcv7zJfly5d1LlzZ/3888+qVq2aHn74YV2+fFlvv/22mjRpooSEBJefHRsbqzp16mjkyJFKSkpS27ZtVb16da1atUoPPPCARo8e7TJ/TEyMatSooS+//FKS9PDDD6tx48by8/PTV199pU2bNrnM36ZNG+XKlUvjx49X/fr1FR4ervfff9/4I4MAAAAAPNs/Lmx79+7VkCFDVLx4cT3wwAP65ptvVLx4cb333ns6fPiw1q5d61LYPv74Y82cOVMRERGKiorSmjVrNH/+fB04cEBPP/20tmzZorffftvlM/r27atDhw6pc+fOioqK0qxZs7R69WqtXbtWuXLl0iuvvKIdO3Y4558wYYLOnTun/v37a//+/Zo7d64WLFig7du3Kzo6Wg0bNnT5+S+99JJiYmL0/fffq3PnzoqNjdXrr7+ukiVLqlmzZpo2bZouX778T1cVAAAAANwVh2VZ1t2+6fz585o5c6amTJmiLVu2SJIKFCigJ554Qt27d1edOnVSfd/169dVtGhRJSQk6ODBgypcuLDL6wkJCSpdurQSExN15swZ+fj46NChQ7rnnnsUGBioI0eOKF++fC7vefnllzVq1Cg988wz+uqrryRJ//rXvzR27FgtXLhQbdq0udvF08WLFzVv3jxNnTpVa9eulWVZCgwMVMeOHdWjRw81btxYDocj3Z+RmJioxMRE5/P4+HiFhYXddRbA86S/7cAb3PWfHY+SPbuf3RFs558z0O4IturYdYDdEWz33cIpdkewXfny99sdwVZnzhyzO4Ktbty4rt9/36C4uDgFBQWlO+9dH2H797//raJFi6pfv3769ddf1b59ey1cuFDHjx/XF198kWZZk6Tt27frzJkzqlevXoqyJkn+/v6qWbOmzp8/r6ioKEnSjz/+KEl68MEHU5Q1SerWrZskKTIy0jmtZs2akqT//Oc/Wrp06V0PKJI7d2717NlTP/zwg44cOaL3339foaGhmjx5spo0aaLSpUun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\n",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x1000 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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sSzL9O/f31y5csX07t3b+Rl05coVM3nyZFO0aFHzxBNPmKSkJI9k8rZ+kzeLj493/t0vWrSoadOmjcvf6d9//904HA4zfPhwt2TgjF0mMnPmTI0bN06jR49OdinD0KFDNWbMGOfjdu3aafbs2W4/g5YrVy6PDYiSVtmzZ0925iRPnjySpJMnTyabAiJ//vzasGGDWzLc/nOfPHmyJk+efMfnGGP09NNPuyUP7s3evXtVuXLlZJfPzZgxQ5Zlafbs2XrooYd09epVlSxZUlOnTtUzzzyT4Rlee+21dH3jly1bNo0ZM0bz58/XsGHD9PXXX2d4Jm9080zYzc8ju8+M+Yovv/zS7gjJrFy5UtWrV9egQYNSbfPss89q8uTJ+u677zyYzLfEx8dr3759Gj16tPbv3682bdrYHQn/nzeeHfOGfpOveOedd7RlyxY9+eST+vjjj5U9e3aXS+yLFSumBx54QN99951GjRqV4Rko7DKRqVOnaseOHapevbpz3caNG/XBBx8oT548euSRR7R582bNnz9f06ZNc/vACc2aNdPWrVvduo/0Cg0N1dGjR52PK1SoIElas2aNevToIenPETx/+OEHt03Ke+sk0keOHFHOnDlTvYclICBAxYoVU7t27fTss8+6JQ/uzZkzZ1wGHFizZo1CQ0P10EMPSfrzD2L9+vXd9sfutddeS/dz/Pz8VLNmTa1YscINibzT7UOKM8S4bzpz5kyafncVKlS469D6mV1avrg1xqhQoUJ69913PZDoTydOnNCXX36pdevWJRsDoFGjRoqKivLYwG7e6vDhw2rWrJnz1oubRcGtU6A88MADioiI0KRJkzxS2HlDv8lXzJw5UyVKlNDnn3+e6nzSklS+fHm39Qso7DKR3bt3q0qVKslGBJsyZYosy9KsWbPUokULnT9/XqVLl9b48ePdXti9/fbbql27tl566SX9+9//vuNB7imNGjXSl19+qYsXLyp37txq27atnn32WT377LO6dOmSihcvrgkTJigmJsZtQy7fOom0t93DgrQLDg7W2bNnnY8PHTqkw4cPu/y7CgoK0uXLl92S4fZ77NLq5MmTbsuEv8abBk5Iz1UdnshToEAB7d27967t9u3bp/z587s1i7e79QvE2wUEBKho0aKKiIjQgAEDPDYC5eTJkzVw4EDFx8cnG/jmp59+0vLlyzVq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5cuXN927dzfnz5/32H5T443HuLf1m7yd3f1wCrtMZtmyZcayLPPss886112+fNnkzp3blC9f3qNZ2rRpYwICAsy2bduc627v0BljTNOmTU25cuU8kqlWrVomLCzsru3KlStnateu7fY8ffr0MRMmTLhruy+//NLl5+YugwcPNg6Hw+zdu9e5LjY21hQpUiTZH+GcOXOaffv2eSSTNxo1apSxLMu0a9fO/Pbbb84P7WvXrpk9e/aY119/3eTOndu8+OKLHsvUvn17kz9/fmfnIDg42LRt29a8//77ZuvWrbZ0Erzxc8Bbj/GyZcuanDlzJvtZ2cnbjnFvPL691XPPPWfeeOONFLddvnzZHD9+3Ny4ccNjebztWLqpT58+pmPHjsbhcJi8efOapk2bmt69e5s+ffq4LH379nV7Hm88xr2t3+Tt7O6HU9hlMklJSSYkJMTcd999zg/tadOmGcuyPP5NSv78+U1ERESydSl16Lp3725y5crlsUzt2rW7a7t27dqZggULuj1PSj+PlPTr189jl15Vq1bNVK5cOdm6jz76yFiWZbp372727dtnxowZYyzLMn/72988kskbVa1a1RQoUMB56UlUVJTL72jt2rXGz88vTcV7RklKSjI//vij+eCDD0y7du2SdRLy5s3r7CR4qnjwxs8Bbz3GAwMDTatWrTy2v7vxxmPc245vb+Xv728effRRu2M4eeOxZMzdb4e4/YyiJ3jbMe5t/SZvZ3c/nFExMxnLstSjRw+98847WrJkidq0aaMpU6bI4XB4/Eb7+Pj4NE2keeHCBQ+k+dOVK1eUI0eOu7bLkSOHLl265IFEaXPt2jX5+fl5ZF+///676tWrl2zdokWLlC1bNn344YcqWLCgBg8erMmTJ//lKQB82W+//abw8HAFBQVJ+r957hITE52/q0aNGqlBgwb67LPP/tIE5+lhWZaqVaumatWq6bnnnpMxRjt37nTeiL98+XItWrTIY0Nle+PngLce40WKFHEeT97AG49xbzu+vVVISIiSkpLsjuHkjceSJK1evdoj+0kPbzvGfbXfZBe7++EUdplQVFSU3n77bX311VeqXbu2cxLeW+eN8oTixYvr559/vmMbY4x2797tsSHFQ0ND9cMPP9y13Q8//OD2yX/Tyhij7du3p6lznBEuXryYbGTCxMREbdq0STVr1lTBggWd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0M6dO9WpUyd9++23On78uD755BM99NBDGb1LpxYtWrisK1CggPLnz68TJ06k+JzLly+rTZs2+uabbxQVFaXZs2crMDAwTfsLCQnRsGHD9PPPP2vr1q169tlnde3aNb311luqWLGi6tatqytXrtzxNYYPH67Y2Fjncus9fQAAAACQFtky+gW3bNmihIQE+fn56YUXXtCAAQNUpEiRjN5NikJCQlJcnzt3bp0/fz7FbR9++KFu3Lih1q1ba+LEibIs6572XbNmTVWqVEkPPfSQnn/+eZ06dcr5s8iRI0eqzwsMDExzIQkAAAAAKcnwM3ajR49WVFSUcuTIoZEjRyokJEQtW7bUtGnTdPny5b/02ne7f83hSP/badWqlYKDg7V8+XLNmTMn3c83xmjNmjXq16+fChcurB49euj06dNq0qSJJk+erDx58qT7NQEAAAAgPTK8sKtXr56+/PJLnTx5UpMnT1ZERISWL1+uHj16qEiRIurVq9cdBxkJCAiQJF26dMllmzsuU6xRo4aWLVumnDlzqmvXrvrf//6Xpuf9+uuvevnll1WqVClFRkZqwoQJKlKkiEaOHKmYmBitXLlSvXr1uqdiEwAAAADSw21VR1BQkHr16qWVK1cqJiZGb775pooWLaopU6aoRYsWCg0N1QsvvKBdu3Yle17RokUlSfv27XN5zRUrVrgla506dbR06VLlyJFDXbp00bx581Jsd/r0aY0dO1a1a9fWAw88oFGjRikuLk5PP/20NmzYoL179+rll19WiRIl3JITAAAAAFLikdNJJUqU0L/+9S/t27dPGzZs0NNPP634+Hi99957qlq1qhYtWuRsGxERIenPScLj4+Od61etWqUPP/zQbRnr1aunpUuXKjAwUI8//rgWLFjg0qZ48eIaNGiQfvzxR7Vq1UozZszQiRMnNG7cONWvX99t2QAAAADgTjx+nWD9+vU1btw4nThxQtOnT1fLli1ljHFu79q1q8qXL6+NGzeqYsWKevTRR1W3bl01b95cf//7392ebcmSJfL399ejjz6arOCUpPLly+udd97R0aNHtXjxYj3xxBPKnj27WzMBAAAAwN3YdgNY9uzZ1aVLFy1ZskRt2rRxrs+RI4dWrlyprl276uLFi1q8eLESExM1c+ZMDRgwwO25GjZsqMWLF8vf31+dO3fW0qVLndt2796tF154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\n",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x1000 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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/a0rSZLcEYiIiIjIAMTHx8PKyirHNuxxIyIiIiIiUjgWbkRERERERArHwo2IiIiIiEjhWLgREREREREpHAs3IiIiIiIihWPhRkREREREpHAs3IiIiIiIiBSOhRsREREREZHCsXAjIiIiIiJSOBZuRERERERECsfCjYiIiIiISOFYuBERERERESkcCzciIiIiIiKFK9CFW2BgICRJwtSpU+WOQkRERERE9K8V6MKNiIiIiIioIGDhRkREREREpHB6Kdxu3bqFu3fv6mNXHywkJARCCLljEBERERERaeiscEtISMCKFSvQvHlzVKxYERcuXNBs8/T0hCRJiIqKyvS4qKgoSJIET09PrfVTp06FJEkIDAzElStX0LVrV9jY2MDCwgIeHh44efLke+WbO3cuVCoVqlSpgujoaM36li1bonz58pgyZQpu3br1Xs9JRERERESkC/lauKWnpyM4OBh9+/ZF2bJlMWTIEJw4cQIeHh6oUqVKvuzj/PnzcHd3R1RUFNq1a4dKlSrh2LFjaNWqFa5evZqn5/jPf/6DcePGoV69ejh+/DgcHR012/r164fHjx9j+vTpqFixIlq0aIGVK1ciISEhX/ITERERERG9N5EPrl+/LiZOnCjs7e0FAAFAVK5cWcyYMUNERUVlau/h4SEAiMjIyEzbIiMjBQDh4eGhtX7KlCma5/7555+1to0ePVoAEP3799dav3r1agFATJkyRQghRFpamhg6dKgAIFq2bCkSEhKy/H0SExNFYGCg8PLyEiqVSgAQ5ubmws/PTwQHB4u0tLQ8vzavXr0S8fHxmiU6Olrze3D5sEXp5H59uHDhwoULFy5cuBjGEh8fn/u55b89KX369KlYvHixaNiwoWaHJUuWFCNGjBBnzpzJ8bEfUrg1bdo002NiY2MFAOHs7Ky1/u3CLTk5WfTs2VMAED4+PuLVq1d5+j2jo6PFrFmzRLVq1TS/p729vZg4caK4fv16ro9/u+Dkkr+L0sn9+nDhwoULFy5cuHAxjEVnhduECROEWq0WAIRarRbdu3cX27dvFykpKXl6/IcUbtOmTcvyOYsXLy5MTU211mUUbuPGjRNt2rQRAERAQIBITU3NU853nT9/XowcOVKUKlVK8yI3atRIJCUlZfsY9rjpblE6uV8fLly4cOHChQsXLoax5KVwM8a/cObMGSQnJ8PIyAjj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Wk+vAhERERERFVaSEELIHUKpoqKiUK5cOXh4eCAkJCRfnjMhIQHW1tb58lyFnSQpu8O4bNlyckfIVbFipeWOkKva9TzljpCrE8d2yB0hV4mJT+WOkKO4uEdyR8iVmZmF3BFy9erVc7kjEP0/Se4ApBcsI/JLfHx8rtOGKfvMl4iIiIiIiFi4ERERERERKR0LNyIiIiIiIoUziMFJ5OLi4gLeAkhERERERHJjjxsREREREZHCsXAjIiIiIiJSOBZuRERERERECsfCjYiIiIiISOFYuBERERERESkcCzciIiIiIiKF43QAZLCESJc7Qo7++eeO3BFy9fBhpNwRctV/zOdyR8hVWMg2uSPkqlQpR7kj5Cgu7pHcEXKVmpoidwTSA0lS/nfaSv/7ZyhUKuX/W6enp8kdgRRE+e9YIiIiIiKiQo6FGxERERERkcKxcCMiIiIiIlI4Fm5EREREREQKx8KNiIiIiIhI4Vi4ERERERERKRwLNyIiIiIiIoVj4UZERERERKRwLNyIiIiIiIgUjoUbERERERGRwrFwIyIiIiIiUjgWbkRERERERArHwo2IiIiIiEjhWLgREREREREpHAs3IiIiIiIihWPhRkREREREpHAs3IiIiIiIiBSOhVse7NmzBwMHDkTVqlVhZWUFCwsLuLm5YebMmUhOTpY7HhERERERFXDGcgcwBIMGDcLLly9Ro0YN1KpVC/Hx8Th79iy++uorHD58GMHBwTAyMpI7JhERERERFVAs3PJg2bJlaNu2LczNzTXrEhMT4efnh927d2PDhg3w9/fP8rHJyclavXIJCQk6z0tERERERAULL5XMA29vb62iDQCKFi2K+fPnAwB27NiR7WNnzZoFa2trzeLo6KjTrEREREREVPCwxy2PIiIisHfvXvz999948eIF0tPTIYTQbMvOpEmTMHbsWM3PCQkJLN6IiIiIiOi9sHDLhRAC48aNw/z58zWF2rsSExOzfbxarYZardZVPCIiIiIiKgR4qWQuNm3ahHnz5sHBwQGbN2/G/fv3kZKSAiGE5t617Ao6IiIiIiKi/MAet1xs27YNALB06VJ06tRJa9vt27fliERERERERIUMe9xyERcXBwBwcHDItC0oKEjfcYiIiIiIqBBi4ZYLV1dXAMDy5cu1LokMCwvDnDlz5IpFRERERESFCAu3XIwcORIWFhZYsmQJatSogT59+qBFixbw8PDA8OHD5Y5HRERERESFAAu3XLi6uuL8+fPo0qULYmNjsXPnTjx//hzLli1jjxsREREREekFByfJgypVqmDnzp1ZbuOIkkREREREpGvscSMiIiIiIlI4Fm5EREREREQKx8KNiIiIiIhI4Vi4ERERERERKRwLNyIiIiIiIoVj4UZERERERKRwLNyIiIiIiIgUjoUbERERERGRwrFwIyIiIiIiUjgWbkRERERERApnLHcAooIqPT1d7gi5EkLIHSFXx7eHyh0hVy9fJsgdIVcerXzljpCj27cvyR0hV0YqI7kj5CrdEDKmp8kdIUfGxiZyR8jV69cpckfIlZGR8t+LxkbK/7dOeZ0sd4QcCaH8c52ChD1uRERERERECsfCjYiIiIiISOFYuBERERERESkcCzciIiIiIiKFY+FGRERERESkcCzciIiIiIiIFI6FGxERERERkcKxcCMiIiIiIlI4Fm5EREREREQKx8KNiIiIiIhI4Vi4ERERERERKRwLNyIiIiIiIoVj4UZERERERKRwLNyIiIiIiIgUjoUbERERERGRwrFwIyIiIiIiUjgWbkRERERERApXaAu3PXv2YODAgahatSqsrKxgYWEBNzc3zJw5E8nJyZna7927F23atIG9vT3UajXs7OzQrFkzTJs2TYb0RERERERUmBTawm3QoEHYsmULihcvjg4dOqB58+aIjo7GV199hY4dOyItLU3TdvHixejUqROOHj2KihUrwtfXFzVq1MCdO3cwdepU+X4JIiIiIiIqFIzlDiCXZcuWoW3btjA3N9esS0xMhJ+fH3bv3o0NGzbA398fADB79mxIkoTTp0+jfv36mvZCCISGhua4n+TkZK0evISEhHz+TYiIiIiIqKArtD1u3t7eWkUbABQtWhTz588HAOzYsUOz/vHjxyhWrJhW0QYAkiTB09Mzx/3MmjUL1tbWmsXR0TF/fgEiIiIiIio0Cm2PGwBERERg7969+Pvvv/HixQukp6dDCKHZlqFevXo4fvw4Bg0ahLFjx6J69ep53sekSZMwduxYzc8JCQks3oiIiIiI6L0UysJNCIFx48Zh/vz5mkLtXYmJiZr/X7x4MXx8fLBq1SqsWrUKZcqUgYeHB7p3744ePXrAyMgo232p1Wqo1ep8/x2IiIiIiKjwKJSXSm7atAnz5s2D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/mJfX3+jI7jVuFEzoyO49X3uYaMjlCkmZozREdw6ceJroyO4dfLkd0ZHcOtnP2tidAS3Llw4bXSEMgUGNjA6glvnz58yOkK55OXlKTi47L/zVPqM2/PPP6+wsDAlJiZq3759GjFihNauXauTJ0/qrbfeumVpk6S9e/fq7Nmz6tOnT4nSJkkBAQHq3r27Lly4oG+//VaS9Omnn0qS4uLiSpQ2SZo4caIkadu2bc553bt3lyS98MIL+uc//1nhB48EBQUpISFBW7Zs0fHjx/WnP/1J4eHhWrRokfr3769WrVqVuG/vvyUnJysvL8855eTkVCgDAAAAAFS6uO3atUt2u13e3t5KSkrS22+/rUceeUS+vr5u183OzpYkbdq0SRaLpdTpk08+kSSdPXtWknTy5ElJUsuWLUvd5o35ubm5znkJCQkaPXq0vv76az388MNq0KCB7rvvPr3yyis6fbpi/4IRERGh5ORk/f3vf9c999zj/Bzu7n+zWq0KDg52mQAAAACgInwqu2JqaqrmzZun1atXa+bMmUpNTdX999+viRMnavjw4apfv/4t1y0uLpYktWnTRn379i1zP40aNSpXntIuWfT29tYHH3yg6dOn66OPPtKWLVu0a9cubdu2TbNmzVJ6err69OnjdtsHDx7U0qVLtWzZMmdR69Spk/NySQAAAACoTpUubr1791bv3r311ltvKS0tTYsXL9bGjRu1YcMGBQYG6uc//7kmTpyogQMHysvL9cReeHi4JKlDhw5atGhRufbXrNlP1+0fP3681OU3zuI1b968xLKuXbuqa9euSklJkc1mU0pKit544w0988wzznvz/tuZM2e0cuVKLV26VHv27JH0U4n8zW9+o8cee8x51g0AAAAAqluVnypZv359xcfHa/PmzcrOztbLL7+ssLAwLV26VIMHD1ZERISSkpK0f/9+5zo9evRQSEiIMjMzdf78+XLtJzo6WpKUnp6uixcvlli+bNkySSrxpMj/FhwcrNTUVFksFh04cMBlWX5+vj744AMNHTpUzZs319SpU7Vv3z4NGzZMaWlpOnnypN58801KGwAAAIDbyqPvcYuMjNSLL76ow4cPKysrS5MnT9bVq1f16quvqnPnzs771qxWq5577jldunRJI0aM0NGjR0tsKzc3V0uXLnV+3apVKz300EO6dOmSpk6dquvXrzuX7dixQ++88468vb2VmJjonL906dIS5UyS1q9fL4fDoYiICJf5w4YN05gxY/TJJ5/orrvu0pw5c5Sbm6uPPvpII0aMkJ+fX5WPEQAAAABUVKUvlXSnT58+6tOnj/7yl79o7dq1Wrx4sW5+88D06dOd94517NhRXbt2VVRUlAoKCnTo0CF9/fXXuvvuu51Pi5SkuXPnql+/flqyZIkyMzPVu3dv/fjjj8rIyFBRUZFee+01denSxTk+LS1N8fHxat26te666y4FBATo2LFj2rVrl7y8vDRz5kyXzI0aNdLvfvc7JSQk6K677qquQwMAAAAAFVKl97h5wj/+8Q/NmzdPu3fv1oULF9SgQQNFRERo4MCBevTRR9WtWzeX8efOnVNqaqrWrl2rnJwc1atXTz179tS0adM0ePBgl7Fbt27V//7v/yorK0s5OTm6cuWKmjVr5hxvxCWPNptNISEht32/tZPZ30HGe9w8gfe4eQbvcas63uPmGbzHrep4j5tn8B63quM9bp5Tnve4GV7c6hqKmyeZvXTUhB8tsx9DipunUNyqjuLmGRS3qqO4eQbFreoobp5TrS/gBgAAAADcHhQ3AAAAADA5ihsAAAAAmBzFDQAAAABMjuIGAAAAACZHcQMAAAAAk6O4AQAAAIDJUdwAAAAAwOQobgAAAABgcj5GB6hrHA6H0RFqEY5l1Zn/GNaEnxkyVp3Z80k1I2NxcZHREWq8wsLrRkdwqyZ8n2vGz0ux0RHcMvtxdDjMfwxrivJ8ry0Os/+JqGW+//57RUREGB0DAAAAgEnk5OQoPDy8zDEUt9usuLhYJ0+eVFBQkCwWi0e2abPZFBERoZycHAUHB3tkm55m9oxmzyeR0VPMntHs+SQyegoZq87s+SQyegoZq87s+aS6mdHhcOjSpUtq1qyZvLzKvouNSyVvMy8vL7dturKCg4NN+4f8BrNnNHs+iYyeYvaMZs8nkdFTyFh1Zs8nkdFTyFh1Zs8n1b2MISEh5RrHw0kAAAAAwOQobgAAAABgchS3WsBqteqll16S1Wo1OsotmT2j2fNJZPQUs2c0ez6JjJ5Cxqozez6JjJ5Cxqozez6JjO7wcBIAAAAAMDnOuAEAAACAyVHcAAAAAMDkKG4AAAAAYHIUNwAAAAAwOYobAAAAAJgcxQ0AAAAATI7iBgAAAAAmR3EDAAAAAJP7/wEgc8WBEruT4QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "def plot_attention(sentence, translation, attention:Attention):\n",
    "    fig, ax = plt.subplots(figsize=(10,10))\n",
    "    attention = attention.squeeze(1).numpy()\n",
    "    cax = ax.matshow(attention, cmap=\"bone\")\n",
    "    ax.set_xticks(ticks=np.arange(len(sentence)), labels=sentence, rotation=90, size=15)\n",
    "    translation = translation[1:]\n",
    "    ax.set_yticks(ticks=np.arange(len(translation)), labels=translation, size=15)\n",
    "    plt.show()\n",
    "    plt.close()\n",
    "    \n",
    "def plot_and_save_attention(sentence, model, filename):\n",
    "    translation, src_tokens, attention = translate_sentence(\n",
    "        sentence,\n",
    "        model,\n",
    "        en_nlp,\n",
    "        de_nlp,\n",
    "        en_vocab,\n",
    "        de_vocab,\n",
    "        lower,\n",
    "        sos_token,\n",
    "        eos_token\n",
    "    )\n",
    "    plt.figure(figsize=(10, 10))\n",
    "    plot_attention(src_tokens, translation, attention)\n",
    "    plt.savefig(filename)\n",
    "    plt.close()\n",
    "\n",
    "# 可视化最高BLEU的2个样本\n",
    "for idx, (src, ref, hyp, score) in enumerate(top5[:2]):\n",
    "    plot_and_save_attention(\n",
    "        src, \n",
    "        model, \n",
    "        f\"attention_top{idx+1}_bleu{score:.2f}.png\"\n",
    "    )\n",
    "\n",
    "# 可视化最低BLEU的2个样本\n",
    "for idx, (src, ref, hyp, score) in enumerate(bottom5[:2]):\n",
    "    plot_and_save_attention(\n",
    "        src, \n",
    "        model, \n",
    "        f\"attention_bottom{idx+1}_bleu{score:.2f}.png\"\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('Ein Mann mit einem orangefarbenen Hut, der etwas anstarrt.',\n",
       " 'A man in an orange hat starring at something.')"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sentence = test_data[0][\"de\"]\n",
    "expected_translation = test_data[0][\"en\"]\n",
    "\n",
    "sentence, expected_translation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "translation, sentence_tokens, attention = translate_sentence(\n",
    "    sentence,\n",
    "    model,\n",
    "    en_nlp,\n",
    "    de_nlp,\n",
    "    en_vocab,\n",
    "    de_vocab,\n",
    "    lower,\n",
    "    sos_token,\n",
    "    eos_token,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['<sos>',\n",
       " 'a',\n",
       " 'man',\n",
       " 'in',\n",
       " 'an',\n",
       " 'orange',\n",
       " 'hat',\n",
       " 'is',\n",
       " 'something',\n",
       " 'to',\n",
       " '<unk>',\n",
       " '.',\n",
       " '<eos>']"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "translation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['<sos>',\n",
       " 'ein',\n",
       " 'mann',\n",
       " 'mit',\n",
       " 'einem',\n",
       " 'orangefarbenen',\n",
       " 'hut',\n",
       " ',',\n",
       " 'der',\n",
       " 'etwas',\n",
       " 'anstarrt',\n",
       " '.',\n",
       " '<eos>']"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sentence_tokens"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据可视化结果可知，模型在翻译时，总是会关注在时序上较为临近的token。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Tk5W3759NX36dEm66yG9FEkgdzh69Kgefvhhubm5SfrfOfs3b960L6tatapCQ0MVFRWV54vklClTVKFCBTVu3Piu223atEn79+/n720eM3z4cM2ePVuffvqpPv30UxmGoWeeeUY1atSwb/P777/r0KFDuWK2cIokHCavfcsCc0aMGKHx48fr2rVrmW5jGIZsNht/2PKYlJQULV68WFu2bNG5c+fUoEED9e7dW5J08uRJnTt3TlWrVs3zMwSOGDFC06ZNU5EiRdS9e3eFhITI29vb6lgA7sLT01Oenp72+z4+PpKkU6dOpfksUaxYMa1fv97h+bJbZGSkIiMj71kkJ06cqEmTJvH3No8pW7asdu3apW+++UZnz55VnTp1FBkZmWabnTt3qn379nr66aetCfknefuvPvKUvPYtC7Ju3LhxGjVqlFxdXfX444/zATwfWbdunbp37664uDj7FwE3b960F8mNGzfq6aef1vfff6+OHTtanPb+fPfddypSpIh27txpn5gDQO4WGBiouLg4+/3KlStLklavXq3u3btLuv1l2NatW9NcfzG/S01NZYbpPCogIEAjR47MdH337t3t722rUSThMHntWxZk3X//+195eXlp7dq1XLYlH/njjz/06KOP6ubNm3r55ZfVtGnTdP9ttm3bVgULFtQPP/yQ54vkmTNn9Mgjj1AigTykWbNmmjx5sq5cuSJvb2+1bdtWAwYM0IABA3T16lX5+/tr4sSJio2NVdeuXa2O6zCHDx+2j84COYUiCYfKS9+yIOvi4uIUERFBicxn3nnnHd24cUNLlixRq1atMtzG3d1dtWvXTncx7LyIAgnkPZ07d9b27du1YcMGPfLIIypTpozGjBmjwYMHq3///pJun1bh5+ensWPHWpz273n77bfT3P/111/TLbsjJSVFMTExWrNmjVq2bOmIeMgBu3fv1ueff661a9fqxIkTkiR/f381b95c//jHP1S9enWLE97GdSQB3Ldy5cqpXr16+v77762Ogmzk5+en4OBgbdiwwb7MxcVFkZGRmjRpkn1Z165dtWTJEl26dMmClNln7NixGj16tA4ePKiSJUtaHQfAfdi8ebPmzZtnvxxGr169VKxYMatj/S1/vqZvVq/t+8ADD2jJkiV8wZsHffzxx3rttdd069atDP+tCxQooP/85z/65z//aUG6v2Sx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u+++q2HDhlmc8jaKJBzGzc1N33//vWJjY3X27FlVrlw53Qni5cuX17x589SwYUOLUuLvGDp0qKZPn64HHnhA3bp1U3BwsAoXLmx1rBzjbPvrLN555x3Vq1dPr776qt577718PWFHVqSmpurzzz/Xxo0bVb9+favjwISnnnpKb7zxhoYNG6YPPvggw22GDx+uy5cvq3Pnzg5OZ43ff/89XxxxMHbsWNWrV09Dhw7Vu+++e9dLRCBvstlseu211zRw4EDt2LFDsbGxSk1NVUBAgOrVqyd3d3erI9ox2Q6QDSIiImSz2fTtt98qICDA1IiqzWbTihUrcjBdzvPz81Nqaqp2794tPz8/q+PkuPy6v87+Pn777be1b98+zZo1SyVLltTDDz+ssmXLZlgo88PI+t3+fa9evaojR47owoULstlsWrhwIeeO5iHXr19Xw4YNtWfPHtWvX1/t27fX66+/rmbNmqlDhw6aN2+e1q1bp9q1a2vDhg256oNpVvTu3dv+/6OiolShQgU1bdo0w21TUlIUExOjbdu2qUOHDvrhhx8cFTNHvP322zpy5IimTJmi8uXL5/vZtJG7USThEHFxcdq5c6cqV66skJCQTLdbunSpDMPQY4895sB09+/O7JZ79+5VSEiIqcNn8sNsl4ULF9ajjz6qOXPmWB3FIfLr/jr7+9jZZqm9179vgQIF1KhRI40YMUItWrRwUCpkl7NnzyoyMlJLly7N8H3dsmVLTZs27Z4T8uRGf37vZvW/2erVq2vu3LkKDg7OyWg5ztl+TzmTvPhZmfFwOMTNmzfVoUMHhYeHZzpq8dtvv+nxxx9X69atc8V/HGYcOXJEkuTv75/mvrOoVq2aEhISrI7hMPl1f539fexss9Te7d/X3d1dJUqU4HI9eVjJkiW1ePFi7dq1Sz///HOaw+NatmyZpw9XXrVqlaTb56dHRETo0Ucf1dChQzPc1t3dXWXKlMk310J1tt9TziQvflZmRBIO06xZM23cuFFHjhxRYGBguvVDhgzRBx98oBkzZujpp5+2ICH+ru+//17dunXT5s2bVatWLavj5Dhn218AyK169eqlZs2apTncFcir8tpnZYokHOabb77R888/r9GjR6ebbcowDAUGBur69euKj4/Pc+drZOb8+fOaNm2atmzZonPnzqlFixYaMmSIpNsn/h86dEgPP/yw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1WMAAADvUPZIAgAAUERIAgAAUERINpjrrrsuc+bMya9+9auqRwEAABqUkGwwPT092blzZw4cOFD1KAAAQIMSkgAAABRx1tYGs3Xr1qpHAAAAGpw9kgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQRkgAAABQ5peoBgJOrVqtVPUJdjRkztuoR6qYlLVWPUFdtE6dUPUJdvXhwf9Uj1M24cadWPUJdnXrqaVWPUFdjxo6reoS62fXU36seoa5efLF53qeGhoaqHqFuTvRnR3skAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKCIkAQAAKNLUIblr16709PRUPcab2r59e15++eWqxwAAABjWdCHZ39+fH//4x7n44otz9tln58knnxxxe61Wy8aNG/PRj340U6ZMybhx4/LBD34wq1evzqFDh477mC+88EJWrlyZ97///Rk3blymTp2ayy+/PJs3bz7u9nv27MmXv/zlzJ49OxMmTMjUqVNzzjnn5Prrr8/OnTtHbLtq1apMmzYt119/ff7whz+8PS8CAADAf6ApQnJoaCibN2/Otddem2nTpuWLX/xitm3bloULF2bOnDkjtrv22muzbNmyPP744znvvPNyxRVX5KWXXsptt92WRYsW5fDhwyMeu6+vL/Pnz8/atWtz5MiRLFmyJPPmzcuWLVty2WWX5c477xyxfW9vb84///zcc889SZIrrrgiCxcuTGtra+69995s3759xPaLFy/OhAkTsm7dulx00UWZPXt2br/99v/6PakAAEDjaqnVarWqhzhZnnnmmaxfvz5dXV3p6+tLknzgAx9IR0dHPv/5z+ess84asf13v/vd3HzzzbnkkkuycePGTJs2LUly5MiR3HDDDfnJT36SW265JXfcccfwfa666qo89NBDWbZsWX76059m7Nix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",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_attention(sentence_tokens, translation, attention)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过将任何字符串传递给 `translate_sentence` 来使用它来翻译任意句子。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "sentence = \"Ein Mann sieht sich einen Film an.\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "translation, sentence_tokens, attention = translate_sentence(\n",
    "    sentence,\n",
    "    model,\n",
    "    en_nlp,\n",
    "    de_nlp,\n",
    "    en_vocab,\n",
    "    de_vocab,\n",
    "    lower,\n",
    "    sos_token,\n",
    "    eos_token,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['<sos>', 'a', 'man', 'looking', 'at', 'a', 'a', '.', '<eos>']"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "translation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过注意力也可以发现，翻译出现错误的位置，其注意力也较为弥散。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3AAAALWCAYAAAAH2HGQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQ9ElEQVR4nO3dd5icZaE+4Gc2kEIanZBCiRCCIF2keEIIRQJCAM9RCRKKDZUm0iIcBH9IbzYQRKWIFMFADqBSJBCQliOIVIEQEwGBQMiGJKTt/P7A7GFN213Dzr7JfV/XXF7zzTs7z34uk3m+9/veqVSr1WoAAABo9+pqHQAAAIDmUeAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAsFx44oknMnr06EydOrXWUVpNgQMAAJYL+++/f/bbb7/87Gc/q3WUVlPgWMCycGQCAAA+6L777suECRNSrVZz5ZVX1jpOqylwLGBZODIBAAAfdNVVVyVJttlmmzz99NP505/+VONEraPA0cSycmQCAADmmzFjRm666aZsvPHGOf/881OtVnP11VfXOlarKHA0sawcmQAAgPl+85vf5N13381BBx2UQYMGpV+/fvnVr36VuXPn1jpaiylwNFqWjkwAAMB8V155Zerq6nLQQQclSb7whS/krbfeyu23317jZC2nwNFoWToyAQAASTJp0qTce++9GTx4cPr06ZMkGTFiRKrVauPZZyVR4Gi0LB2ZAACAJLnmmmuSvF/a5ttoo42y9dZb54477shbb71Vq2itosCRZNk7MgEAAMn7azystNJK+cxnPtNk+0EHHZTZs2fnuuuuq1Gy1lHgSLLsHZkAAICHHnooL7zwQvbdd9907dq1yWMHHHBAVlhhheImK1aodQDah8UdmTjmmGNy3XXX5YgjjqhROpY1L7/8csaOHZvXXnsts2bNWuiYSqWS//7v/27jZADAsuSqq65KpVJpMkkx3xprrJHdd989v/3tb/P0009nk002qUHClqtUq9VqrUNQWw899FB23HHHHHjggY0zcfO9+eab6dOnTzbffPM89thjNUrIsmL27Nn50pe+lGuvvTZJsri3n0qlknnz5rVVNOAD5s6dm7feemuRB1iSZJ111mnDRAAtN2vWrPTq1Stdu3bNpEmTUqlUFhhzww035IADDshxxx2Xc889twYpW84MHMvkkQnap1NPPTW//OUvs/LKK+cLX/hCBgwYkO7du9c6FvBPd999d84444w8/PDDmTNnziLHVSoVKxQD7d7jjz+eLbbYIsOGDVtoeUuSYcOGZZdddsnf//73Nk7XembglnPL6pEJ2qd11lkn7777bh5//PGsu+66tY4DfMBtt92W/fbbL/Pmzcsqq6yS9ddff7EHWO699942TAfAfGbglnPL6pEJ2qc33ngjn/rUp5Q3aIdOP/30NDQ05KKLLsoRRxyRDh061DoSAAthBg5oMxtttFEGDhyYW2+9tdZRgH+x0korZauttsoDDzxQ6ygALIavEQDazGGHHZYxY8bkzTffrHUU4F9069bNwiTAMueFF17I1VdfnZdffrnJ9ocffjjbbbddunXrlo9+9KP5zW9+U6OELafAAW3m+OOPz9ChQ7Pzzjvn3nvvXewqlLzv6quvzh//+Mcljnv44Ydz9dVXt0EillW77rprxo0bV+sYAEvVBRdckMMOOywrrrhi47bXX389n/rUp/Loo49m5syZee655/K5z30uf/rTn2qYtPkUOJbJIxO0TxtssEEeffTRPPvss9l1113TpUuXrLfeeunfv/8Ct4985CO1jtsuHHLIIbniiiuWOO5nP/tZDj300DZIxLLqnHPOSX19fU488UQrTALLjAceeCBbbLFF+vbt27jt5z//eaZNm5Zjjz02M2fOzG9+85s0NDTkwgsvrGHS5rOICbngggtyxRVXZMKECY3b5h+ZmDZtWiqVSuORiUceeSRbbbVV7cJStA/+jSXvfy/cxIkTaxNmGdPQ0LDIhYigOX7xi19k6NChOf/883PzzTdn8ODB6du3b+rqFjzWW6lU8t///d81SAnQMq+99loGDx7cZNvvfve7dOrUKaeddlo6duyYfffdN5/4xCfyyCOP1CZkCylwLPHIxJlnnpk77rgjn/nMZ3LhhRfml7/8ZQ3TUrKGhoZaR1hmjR8/Pj169Kh1DAp22mmnpVKppFqtZvz48Rk/fvwixypwQCnee++9Jqvqzpo1K4899lg+8YlPpFu3bo3b119//fz5z3+uRcQWU+BYJo9MQMm++93vNrn/xBNPLLBtvrlz5+b555/P/fffn912260t4rGM+sUvflHrCABLXd++ffPkk0823r/77rvz3nvvZciQIU3GzZw5M127dm3reK2iwLFMHpmAkn1wJqRSqeSJJ57IE088sdjnrLnmmjnzzDPbJiDLpIMPPrjWEQCWuiFDhuTyyy/PMccck1122SUjR45MpVLJsGHDmoz7y1/+kn79+tUoZcsocCyTRyZo32bMmJFx48bltddey6xZsxY5bsSIEW2Yqv2YPxNSrVZz2GGH5ZOf/GS++MUvLnRsx44d07t372y33Xbp1KlTW8YEgHZv5MiRufHGG/PDH/4wP/zhD1OtVvO5z30um2++eeOYp59+Oi+99FKOOOKIGiZtPgWOZfLIBO3XqaeemosuuigzZsxY5Jj5M0/La4H74EzIVVddlaFDh5odoc3MnTs3t99+ex599NFMnjw5n/jEJ3LYYYclSV599dVMnjw5H/3oR7PCCj5CAO3fOuuskz//+c+54oor8uabb2brrbfOIYcc0mTM448/nmHDhuWzn/1sbUK2UKXqi5iWexMnTsyWW26Zd955J0kaj0xcd911jWOefvrpfOxjH8sRRxyRH/zgBzVKSunOPffcnHTSSenQoUOGDh2aAQMGpHv37osc/53vfKcN0wEPPPBAvvCFL2TSpEmNB1IOPvjg/PznP0+S3HzzzfnsZz+bX//619l///1rnBZg+eTwGcvkkQnap5/+9Kfp0qVLxo4d6+sooJ155plnsscee2TOnDk58sgj88lPfnKB9/y99947K620Um6++WYFDqBGzMABbaZz584ZMmRI7rjjjlpHKcozzzyTc889N/fff39ee+21zJ49e6HjKpWKL2Cm1Q444ID8+te/zh133JHdd989SVJXV5dDDjmkcQYuSXbaaae8+eabeeaZZ2oVFaDFnnzyyfz4xz/O2LFj88orryRJ+vTpk0GDBuXrX/96NttssxonbD4zcECb6dWrl4VwWuihhx7KrrvumpkzZyZJVl111fTq1avGqcowZsyYxtK7qMVyKpVKfvazn7Vxsvbp3nvvzbbbbttY3halT58+ViQGivL9738/xx9/fObNm5cPzl0999xzee655/Lzn/885513Xo4++ugapmw+BY5Gy9KRCdqnz3/+8/nZz36W6dOnK3LNNHLkyMycOTPHHHNMTjnllKy66qq1jtTuTZ06NcOGDcvYsWOzpJNMFLj/88477zRroarp06dnzpw5bZCoHPfdd1/uu+8+BwugHbrrrrvyzW9+MyuttFIOP/zwHHTQQVlvvfVSqVQyYcKEXHPNNfnJT36SY489Nptuuml22WWXWkdeIqdQkmTRRybmW2GFFYo6MkH79N5772X33XfPiiuumMsuuywbbLBBrSO1e926dcuAAQPypz/9qdZRinH44Yfn8ssvzwYbbJDDDz98iYvl7LTTTm2Yrv1aZ511ssYaa+R///d/G7ct7BTKAQMGpK6uLs8991wtYrYrb7/9dvbbb7888MADzTpYMG/evDZKBsw3dOjQ3HPPPRkzZkx22GGHhY556KGHMmjQoOy2225FXOZhBo5l8sgE7dOee+6ZhoaGjBkzJhtvvHHWXXfd9O3bN3V1dQuMrVQqueeee2qQsn3p2LFjBg4cWOsYRbn11luz1lpr5eGHHzZj2QJDhgzJNddck3vvvTc777zzQseMGjUqL774Yr7xjW+0cbr26Zvf/GbGjh2bTTbZJF/5ylfSv3//dOvWrdaxgA949NFHs9NOOy2yvCXJ9ttvn8GDB+eRRx5pw2StZwaOZfLIBO3Tworaojha/b599tknEydOzBNPPFHrKMVYaaWVsueee+amm26qdZSiPPfcc9lyyy3TsWPHnH322dlvv/3Su3fvHHLIIbngggsyatSoHHfccZkzZ06efPLJrL/++rWOXHOrrrpqunXrlmeeeUZxg3aqS5cu2W+//fKrX/1qseOGDx+eUaNGNV5z3p4pcGS11VbLVlttlbvuumux43bbbbf86U9/yltvvdVGyVjW/O1vf2vR+HXXXfdDSlKOp556Ktttt13OOeccsx7NtPnmm6d379757W9/W+soxbnlllty0EEHZcaMGQt9vHPnzrnuuuuyzz77tHGy9qlnz57ZY489csMNN9Q6CrAIAwYMyJw5c/LCCy9khRUWfvLh3Llzs+GGG2bFFVfMX//61zZO2HJOoSQzZszIGmusscRxa6yxxiL/UYfmUMiW7Oqrr15g26GHHpqjjjoqN954Y3bbbbdFnnaaJCNGjPiwI7Z7Rx55ZI488si8+OKLrrNsoX333TdPPfVULrrootx1112ZMGFCGhoa0rdv3+y222751re+lY985CO1jtlubL311vnHP/5R6xjAYgwbNiwXXHBBDjvssPzgBz/Iyiuv3OTx+vr6HH300Zk4cWK+9a1v1SZkC5mBY5k8MgGlqqurS6VSWWD7B9+qF/W4007/z4knnphf/vKXOeOMMxpLLyxtf/jDH7LHHntk9OjR2WOPPWodB1iIt99+Ox//+MczYcKEdOvWLXvssUfWW2+9JO+fGfS73/0u9fX16d+/fx577LGsssoqtQ3cDGbgWCaPTFCGd955J9OmTVvk6m3rrLNOGyeqvVNPPXWhBY1F69Chw0K3V6vVfOlLX1rsc335Of+OIUOG5Fe/+lVGjBiRPffcM7vttlv69OmzyBnyQYMGtXFCYNVVV83YsWPz1a9+Nbfffnt+/etfLzBmr732ymWXXVZEeUvMwJFl88hEW5o7d27eeuutRX73T7J8FpFF+cc//pFTTjklo0ePXuz1lD5Y01zzV81trZdffnkpplk2eF9rviuvvDInn3xys06lNEMOtfXyyy/ngQceyKuvvpok6d27dz75yU8WtyiTAkeS5NVXX208MrEw849M9O7du42TtV933313zjjjjDz88MOL/VJbReT/vPbaa/n4xz+eV199NX369MmcOXPyxhtvZPvtt8/48ePz+uuvp1KpZPvtt8+KK66Ye++9t9aRYbnifa1lrrzyynzxi19MtVrNlltuucSvEfjFL37RhumAZZVTKEny/hGI//mf/1lmjkx82G677bbst99+mTdvXlZZZZWsv/76i/2iYN53xhln5NVXX813v/vdnHLKKTn00ENz9dVX58EHH0yS3H///fna176WSqViBcGF+POf/5xHH300kydPziabbNK4EuCsWbMya9as9OjRo8YJKZn3tZY799xz06lTp9xxxx0ZPHhwreMAzfDCCy9k8uTJWW211TJgwIBax2mdKtBi22yzTbWurq568cUXV+fOnVvrOMXo379/tX///o33DznkkGpdXV2TMX//+9+rXbt2rX77299u63jt1nPPPVfdfvvtq3V1dY23Qw89tPHxn//859W6urrqb3/72xqmpHTe11quS5cu1T322KPWMYAleO+996ojR46srrbaagv9d/Saa66pbrnlltXHH3+8diFboPnfqsty6dlnn81NN91UzDfTt5Wnn34622+/fY4++uhFLqDAgl555ZVsscUWjffn77sPXmfTp0+f7LzzzrnxxhvbOl67NGnSpAwaNCgPP/xw9t5775x77rkLLPry2c9+Nh07dszNN99co5TtyxVXXJFVV101v/vd7xY55re//W1WXXXVXHnllW0XrJ3zvtZyffr0yUorrVTrGMBizJw5M4MHD84555yTjh07Zs8991zg39EhQ4bkz3/+czGfPRQ4csMNN2TIkCELlLTjjjsum266aT73uc9lhx12aDy1hqRbt24u4G+Ffz3Fb/6Kp6+88kqT7Z07d15g2/Lqu9/9biZPnpwrrrgit9xyy0JXgu3atWu22GILB1r+6frrr0+nTp2y++67L3LM7rvvno4dO+ZXv/pVGyZr37yvtdyIESNy77335u233651FGARzj333DzyyCM57LDDMn78+PzP//zPAmN69+6dj370o7n77rtrkLDlFDjyy1/+Mk888US23HLLxm1//OMfc+GFF6Z79+75/Oc/n/XWWy+jR4/OtddeW8Ok7ceuu+6acePG1TpGcdZZZ51MnDix8f6mm26aJLnjjjsat82YMSMPPvhg1l577TbP1x797ne/y2abbZbDDjtssePWW289pfefnnnmmWy22WaLXMo9eX/2d/PNN88zzzzThsnaN+9rLfftb387O++8c3beeeeMGTNmkV+JwqLNnTs3r7/+eiZOnLjIG/w7brjhhqyzzjq59NJL07lz50WO22ijjTJp0qQ2TNZ6Chx56qmnstlmm6Vjx46N26655ppUKpXceOONufbaa/PYY4+lW7duueKKK2qYtP0455xzUl9fnxNPPNFKbC0wZMiQPPnkk3nzzTeTJPvss0+6du2a448/PieddFJ++MMfZuedd87rr7+eoUOH1jht+/DGG29ko402WuK4OXPmZMaMGW2QqP17++23s/rqqy9x3Oqrr57Jkye3QaIyeF9ruQ033DCPP/54nnrqqeyyyy7p0qVL1ltvvfTv33+B20c+8pFax21X7r777gwePDjdunVL7969s/766y/01r9//1pHpXAvv/xyttlmm6ywwuLXbuzYsWOmTJnSRqn+PVahJG+88UZ22GGHJtvuvfferLnmmo2nIK266qoZNGhQ/vd//7cWEdudX/ziFxk6dGjOP//83HzzzRk8eHD69u270CP+lUol//3f/12DlO3PgQcemEmTJuWZZ57JTjvtlFVXXTWXXXZZDj300Jx77rmpVCqpVqvZZJNN8r3vfa/WcduF1VZbrVlHoP/617+atfyn1VdfPS+88MISx73wwgu+1/IDvK+13IQJE5rcnz17thmjZrDiKW2pS5cuzSpmL7/8cjH/JihwpEuXLqmvr2+8/9prr+Wvf/1rPvvZzzYZt/LKKxdzZOLDdtpppzWWjfHjx2f8+PGLHOuDzv/ZfPPNc9111zXZdsABB2THHXfMHXfckSlTpmTAgAHZZ599suKKK9YoZfuy44475pZbbskTTzzRZAGYD7rvvvvy1FNP5ZBDDmnTbO3VJz/5yfz617/OmDFjFrm0+5gxYzJu3Ljsv//+bRuuHfO+1nINDQ21jlCk008/PQ0NDbnoootyxBFHWDSHD9UWW2yRcePG5c0338waa6yx0DEvv/xyHn/88cVeO92eKHCkf//+GTt2bN55552svPLKufbaa1OpVBb4I/7HP/6RNddcs0Yp2xdfxrp0rbPOOjn88MNrHaNdOu644zJq1KgMGzYsP/nJTxb47/IPf/hDDjnkkKywwgo55phjahOynTn22GNz0003Zd99980pp5ySL3/5y+nZs2eSpL6+Ppdffnm+973vpa6uLt/85jdrnLb98L5GW/ngiqfwYfvyl7+cMWPG5IADDsj111+/wCn277zzTg477LDMmTMnX/nKV2qUsmUqVVfcLvcuueSSHHHEEVl//fWzxRZb5Pbbb0+nTp0yfvz4rLbaaknev75mzTXXzDbbbJO77rqrxokp3YQJE3L//ffntddea/IVAh/kCP//ueSSS3L00UenoaEhK620UmbMmJFu3bqlrq4u9fX1qVQqueSSS4r5h6ctfP/738+xxx7beH/VVVdNkiarBZ533nlNxgBtY80118yuu+5qFVjazPDhw3P99denW7du2WGHHXLnnXdmww03zMCBA3Pfffelvr4+I0aMKOarZRQ4MmfOnAwfPrzxO6S6du2an/70p/n85z/fOGbUqFH5zGc+k+9973sZOXJkraJSuPfeey9f/vKXG//RXtzbT6VS8bUVH/Dwww/n7LPPzh/+8Ie8++67Sd7/uoXBgwfn5JNPzo477ljjhO3P/fffn7PPPjv33XdfZs6cmeT9U8YHDx6cE088MYMGDapxQkrz717f5msa3jd8+PCMGzcuf/3rX2sdheVEtVrN+eefn/POO2+Bxat69uyZE044ISeddFIqlUqNEraMAkejCRMm5M0338zAgQMXuJj4iSeeyN/+9rdst912WWuttWqUkNIdffTR+eEPf5g111wzBx54YPr3759u3botcvzBBx/chunKUK1WM3ny5DQ0NGT11Vd37UgzzJs3L2+99VaS9xc4WdzXC8Di1NXVtfoDXqVSsbrnP02aNCkf//jHc/DBB+d73/veElcHhKVl3rx5+dOf/pQJEyakoaEhffv2zcc//vEmK7GXQIGDZhgyZEgqlUquuuqq9O3bN0OGDGn2cyuVSu65554PMV05evXqlYaGhjz55JPp1atXrePAcs37WssNHjz43zpCf++99y7FNOX67ne/m5dffjlXX3111l9/fSueQgspcMu5SZMm5fHHH8/AgQMzYMCARY777W9/m2q1mj333LMN07Uf84+6PvvssxkwYECLjuA7FfD/dOvWLXvssUduuummWkeB5Z73NWpl/t9ecz6C+lvj37Gsfs41Z72cmzNnTvbdd9/svPPOizya+pe//CV77bVXhg4dWswf9tL28ssvJ0n69OnT5D4ts+mmmzb5ygoWZFak5eyz1vG+Rq1Y8ZS2sqx+zlXglnP9+/fPjjvumPvuuy+TJk1Kv379FhhzzTXXpFKpLNfXI6277rqLvU/zfOtb38qBBx6Yxx9/PFtuuWWt47RLY8aMSaVSyYwZMxrvN1cpF18vbfZZ63hfo1aW588TtK1l9XOuAkcOPvjgPPjgg7n22mtz0kknNXmsWq3mV7/6VVZeeeXsu+++tQnYjr311lv55S9/mUcffTSTJ0/OLrvskhNOOCHJ+99z89JLL2XXXXfNSiutVOOk7cN//dd/5e9//3t22223HHHEEdltt93Sp0+fRZ66tTyu2GZWpOXss6XL+9qi3X///UmSbbfdNp07d26831xWPoW2tyx+znUNHJk2bVp69eqVddddN88880yTx+6+++7svvvu+epXv5pLL720Rgnbp1//+tf50pe+lHfffTfVarXx6M3Pf/7zJMmdd96ZoUOH5qqrrsoXvvCFGqdtP+6555587Wtfy0svvbTYcVZsg7bnfW3xFnbdYEtmcV3L9X+q1Wquvfba3HrrrXnhhRcybdq0hV4TV6lUlvjvBSzOsvg51wwc6d69e/bdd99cf/31GTduXLbZZpvGx0qcVm4LDz30UIYPH54ePXrkggsuyCc/+clsu+22Tcbssssu6dmzZ37zm98slx90Fua2227L/vvvn7lz52b11VfPuuuuu9ivESB5/fXX8/zzz2ejjTZq8hUeL730Uk4++eQ89dRTWWeddXLqqadmu+22q2HS9sM+ax3va0s2/9/Cnj17JklGjBixXJ+G21qzZ8/OXnvtlT/84Q+LXMikuYucwJIsk59zq1CtVn//+99XK5VK9aijjmrcNn369Gr37t2rG220UQ2TtU+f/vSnqx07dqz+7//+b+O2SqVSPfTQQ5uM22WXXaobbrhhW8drt7baaqvqCiusUL3yyiurDQ0NtY5ThGOOOaZaV1dXff755xu3TZ06tdqrV69qXV1dtVKpVCuVSnWllVaq/vWvf61h0vbDPmsd72tLNnjw4Oo555zTeP++++5r8ndG85x55pnVSqVS3WeffaovvvhidcSIEdW6urrq7Nmzq88991z19NNPr3bv3r16wgkn1Doqy4hl7XOubzMlSRqvRbr++usbT/G45ZZb8u6772bEiBE1Ttf+/PGPf8z222+frbbaarHjevXqlddee62NUrV/zz77bAYNGpSDDz7YUetmGjNmTD760Y82Wf74yiuvzOuvv54DDjggzz//fC688MLMnDkzF1xwQQ2Tth/2Wet4X1uy++67L88991zj/Z133jnnnHNODROV6YYbbsiqq66aX/3qV/nIRz7SeB30iiuumI022iinnnpqbr/99lxwwQWNp+/Cv2NZ+5yrwJHk/VMVvvCFL2Ty5Mn57W9/m+T9aeW6uroi/7A/bDNmzMgaa6yxxHFTpkxpgzTlWH311bP66qvXOkZRXnnllfTv37/Jtttvvz0rrLBCLr744my44YY55phjsvnmm+e+++6rUcr2xT5rHe9rS9axY8dMnz698X61WnWaXyu8+OKL2XbbbdO1a9ckaSxwH7xG8D/+4z+y44475pJLLqlJRpYty9rnXAWORoccckiq1WquvvrqvP7667n77ruz8847p2/fvrWO1u706dMnTz/99GLHVKvVPPXUU1l//fXbKFX795//+Z+5//77895779U6SjGmTZvWZLW/efPm5aGHHsrWW2/dpAwPHDgwf//732sRsd2xz1rH+9qSbbDBBrnnnnty3333ZeLEiUmSd999NxMnTmzWjfd16NCh8TrCJI1F7s0332wyrk+fPnn++efbNBvLrmXpc64CR6ONNtooH//4x3Pbbbflkksuybx588q7qLON7LHHHnn++edz/fXXL3LMFVdckUmTJmWvvfZqw2Tt2xlnnJH11lsv++yzj1XFmql3795NTtl64IEH8u6772bw4MFNxs2dOzcdO3Zs43Ttk33WOt7XluwrX/lK3n777QwZMqSxxN58881Zf/31l3j711nh5VmfPn2aHDzZYIMNkiQPP/xwk3FPPvmkha5Yapalz7lWoaSJgw8+OEcccUTOOuusdO/ePZ/5zGdqHaldOumkk/KrX/0qI0aMyOOPP5799tsvSTJ9+vQ8/vjjGTVqVM4999ysscYa+eY3v1njtO3Hpz/96XTo0CH33HNPBg4cmPXWW2+R3wNXqVRyzz331CBl+7L99tvnuuuuy8UXX5xddtklp5xySiqVSvbee+8m45599tnG70Fb3tlnreN9bcmOOuqo9O3bN7feemv+/ve/5957782aa66ZgQMH1jpaUbbbbruMGjUqs2bNSqdOnbLnnnvmm9/8Zo455ph07tw5ffr0yeWXX55nn312gf9uWbxbb701U6dOTZIiTw38sC0zn3NruYIK7c+UKVOqnTt3rtbV1VUPO+ywWsdp1/74xz9W11577WqlUqnW1dU1uVUqlepaa61Vffjhh2sds12Zv/pfc251dXW1jtsuPPXUU9UuXbo0+dsaMmRIkzEvv/xytVKpVL/0pS/VKGX7Yp+1nve1llnYKp0s2W233Vbt1atXdfTo0Y3bjj322CZ/d5VKpdqtWzerfLbQwIEDG/chC1pWPueagaOJlVdeOUcddVQeffTRfOUrX6l1nHZt++23z/PPP5+f/exnueuuuzJhwoQ0NDSkb9++2W233fLVr361yTn+JC+//HKtIxRnk002yQMPPJDvf//7mTx5crbeeuscf/zxTcb8/ve/z+abb5599923NiHbGfus9byvtcx3vvOdbLnllrWOUZy99tprgZVML7jggnz84x/PLbfckilTpmTAgAE56qijsuGGG9YoZZk+/vGPp1evXrWO0W4tK59zK9Wq5ZMAAABKYBETAACAQihwAAAAhVDgAAAACqHAsYBZs2bltNNOy6xZs2odpSj2W8vZZ61jv7WcfdY69lvL2WetY7+1nH3WOsvCfrOICQuor69Pz549M3Xq1PTo0aPWcYphv7WcfdY69lvL2WetY7+1nH3WOvZby9lnrbMs7DczcAAAAIVQ4AAAAArhi7xrpKGhIa+++mq6d++eSqVS6zhN1NfXN/lfmsd+azn7rHXst5azz1rHfms5+6x17LeWs89ap73ut2q1mmnTpqV3796pq1v8HJtr4Grk73//e/r161frGAAAQDsxadKk9O3bd7FjzMDVSPfu3T9wr33NwLVnF11/U60jFOnZh56tdYTiXP79U2odAQBYzjTtCAunwNXI/502WWl3p1C2Z11W6lrrCEXq2KlzrSMUyH+XreOkDgBoreb0AouYAAAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwLXA7bffnsMOOywbb7xxevToka5du2bzzTfPmWeemVmzZtU6HgAAsIxbodYBSvLFL34xM2fOzKabbprNNtssU6dOzaOPPpqTTz4599xzT+6888506NCh1jEBAIBllALXApdddll23333dOnSpXHbtGnTMnz48Nx222259tprM2LEiBomBAAAlmVOoWyBYcOGNSlvSdK9e/dcdNFFSZJbb711kc+dNWtW6uvrm9wAAABawgxcC73wwgu544478uKLL2b69OlpaGhItVptfGxRzjrrrJx++ultFRMAAFgGKXDNVK1Wc9xxx+Wiiy5qLGz/atq0aYt8/siRI3Psscc23q+vr0+/fv2Wek4AAGDZ5RTKZrrhhhty4YUXpm/fvrnpppvyyiuvZPbs2alWq40rUC6q2CVJp06d0qNHjyY3AACAljAD10yjRo1Kklx66aXZa6+9mjw2fvz4WkQCAACWM2bgmmnKlClJkr59+y7w2I033tjWcQAAgOWQAtdMAwYMSJJcfvnlTU6VHDt2bM4777xaxQIAAJYjClwzHXXUUenatWsuueSSbLrppjnggAMyaNCg7LTTTjn88MNrHQ8AAFgOKHDNNGDAgIwbNy577713Jk+enNGjR+fdd9/NZZddZgYOAABoExYxaYGBAwdm9OjRC31scStQAgAALA1m4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFCISrVardY6xPKovr4+PXv2rHWM4vTq1b/WEYr02NOP1TpCcbb56Na1jlCkN96YWOsIxalUKrWOUCQfX1quWm2odQRgCaZOnZoePXosdowZOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKUUSBmzBhQiqVSgYPHpzp06fn2GOPTb9+/dKlS5dstdVW+Z//+Z/Gsb/+9a/ziU98Il27ds1aa62Vo446KjNnzmzy85544omccMIJ2XrrrbPGGmukU6dO6d+/f77+9a/n1VdfXezrz5w5MyeddFLWXXfddOrUKRtssEHOOeecVKvVD30/AAAAy7dKtYDmMWHChKy//vrZfvvt09DQkJdffjmDBg3K5MmTc//996dSqeR3v/td/vKXv+SEE07ITjvtlB49euT+++/PW2+9leHDh+faa69t/Hmf//znc/PNN2ezzTbLOuusk+T9UjdhwoSsvfbaGTduXHr37r3Q1+/QoUOeeeaZxjJ533335b333svJJ5+cM844o9m/U319fXr27Ln0dtJyolev/rWOUKTHnn6s1hGKs81Ht651hCK98cbEWkcoTqVSqXWEIhXw8aXdqVYbah0BWIKpU6emR48eix1TVIFLkiFDhmT06NHp2rVrkuTKK6/MoYcemg022CBvvfVW7rzzzmyzzTZJkldffTVbbrll3njjjbz00kvp3//9D//33ntvPvrRj2attdZqfI2GhoacccYZ+c53vpNDDz00P//5zxf6+jvttFNGjx7duGPHjRuX7bbbLp06dcrrr7+ebt26Net3UuBaR4FrHQWu5RS41lHgWk6Ba50CPr60OwoctH/NKXBFnEI5X11dXS699NLG8pYkI0aMyOqrr54XX3wx3/jGNxrLW5L07t07Bx54YJLk/vvvb9y+8847Nylv83/2qaeemj59+mT06NGLfP3LLrusyU7dZpttMnTo0MyYMSPjxo1bZPZZs2alvr6+yQ0AAKAlVqh1gJZYb731MmDAgCbb6urqsu6662by5MnZfffdF3jO/Fm31157rcn2t956K6NHj85TTz2Vd955J/PmzUuSzJkzJ2+99VbefvvtrLrqqk2es+6662ajjTZa4DXmZ/rX1/igs846K6effnozfksAAICFK6rA9enTZ6Hb55+2uLDH5z82a9asxm3XXXddvvKVr+Tdd99d5GtNmzZtgQLXt2/fhY7t3r37Aq/xr0aOHJljjz228X59fX369eu3yPEAAAD/qrhTKP+dx5Pkb3/7Ww455JDMnj07F198cV544YXMmDEj1Wo11Wo122+/fZKFn1vfnJ+/KJ06dUqPHj2a3AAAAFqiqBm4peGOO+7I7Nmzc9xxx+Xoo49e4PHx48fXIBUAAMCSFTUDtzRMmTIlycJPh7z//vvz+uuvt3UkAACAZlnuCtz8BUd++ctfZvr06Y3bX3nllRx++OG1igUAALBEy12B22effbLJJptk3Lhx2WCDDfKf//mf+fSnP50BAwZklVVWyQ477FDriAAAAAu13BW4jh07ZuzYsfna176Wzp0757bbbsuzzz6bI488MnfddVdWXHHFWkcEAABYqEp1Ycst8qGrr69Pz549ax2jOL169a91hCI99vRjtY5QnG0+unWtIxTpjTcm1jpCcSqVSq0jFMnHl5arVhtqHQFYgqlTpy5xtfrlbgYOAACgVAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACrFCrQOQJJVaByjGG2/8rdYRirRB7361jlCc996bXusIRVp99T61jlCcKVNer3WEIlUq/u1sqWrVPqOtVGsdYJlmBg4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAoRIsLXKVSyXrrrfchRFmywYMHp1KpZMKECc0af8ghh6RSqWTMmDEfai4AAIC2YAYOAACgEMt0gTvrrLPy7LPPZtttt611FAAAgH/bCrUO8GFae+21s/baa9c6BgAAwFKxVGfg7rjjjuy2225ZZZVV0rlz52y00UY56aST8s477yx0/Ny5c/PDH/4wW2+9dbp165Zu3bpl2223zaWXXpp58+Y1+3WnTp2aQYMGpVKp5Mgjj0y1Wk2y6Gvg1ltvvVQqlSTJFVdckc022yxdunRJr1698tWvfnWReSdMmJDhw4dnjTXWSNeuXbPNNtvk+uuvz4QJE1KpVDJ48OBmZwYAAGippVbgzjrrrOy1114ZM2ZMtt566+y7776ZMWNGzjnnnHziE5/I66+/3mT8vHnzMmzYsBx11FF58cUXs9tuu2XXXXfNc889l69//ev5r//6rzQ0NCzxdV9//fUMHjw4Y8eOzamnnpof/vCHjeVsSU444YR84xvfyNprr52hQ4emWq3m8ssvzz777NNYAud78cUXs+222+a6667LyiuvnH322Sddu3bN8OHDc/HFFzd7PwEAALTWUjmF8rHHHsspp5ySbt265e67784nPvGJJMmsWbNy0EEH5de//nW+8Y1v5Kabbmp8zsUXX5w77rgjm2yySe65556stdZaSZLXXnstO++8c0aNGpVLLrkkRxxxxCJfd8KECdltt93y0ksv5Qc/+EGOPPLIFuW+5ppr8uSTT2ajjTZKkkyePDnbb799xo4dm3vvvTdDhgxpHHv44YfnzTffzOGHH54f/ehH6dChQ5Lk97//ffbee+8WvS4AAEBrLJUZuB/96EdpaGjIkUce2VjekqRTp0750Y9+lC5dumTUqFGZNGlS42M/+MEPkiQXXnhhY3lL3r9u7bzzzkuSfP/731/kaz799NPZcccdM2HChFxzzTUtLm9J8v/+3/9rLG9Jsvrqq+fwww9Pktx///2N21988cXcc889WXnllXPeeec1lrck+dSnPpXPfvazS3ytWbNmpb6+vskNAACgJZZKgRs7dmyS5MADD1zgsTXXXDO77757Ghoa8uCDDyZJJk6cmIkTJ2aNNdbI7rvvvsBzPv3pT2fllVfOiy++mH/84x8LPP7www9n0KBBmTJlSkaNGrXQ122Ohb32gAEDkrw/Ezjf/Nx77LFHunXrtsBzPve5zy3xtc4666z07Nmz8davX79WZQYAAJZfS6XAvfrqq0myyC/4nr/9lVdeaTJ+3XXXXej4SqXS+Nj853zQQQcdlLfffjtXXnllPv3pT7c6d9++fRfY1r179yTvz5jNN7/MLap0rbPOOkt8rZEjR2bq1KmNtw/ORgIAADRHm3wPXHMXFWnucw444IAkyamnnrrQGbrmqqtru6/B69SpU3r06NHkBgAA0BJLpcH07t07SfK3v/1toY9PmDAhSdKnT59mjf/gY/Of80Hf/e53c+KJJ+b555/PkCFD8sYbb7Q6e3PM/y65Rc2amU0DAADawlIpcP/xH/+RJLnuuusWeOzNN9/M73//+1Qqley4445J3j/lcJ111smbb76Ze+65Z4Hn3H777ZkyZUo22GCD9OrVa6GvefbZZ+e4447Ls88+myFDhuTNN99cGr/KQu2www5J3l9xcvr06Qs8fuONN35orw0AADDfUilw3/jGN1JXV5cf/OAHGTduXOP22bNn58gjj8zMmTOz//77N7mGbP6qkccee2yT8vWPf/wjxx9/fJLk6KOPXuzrnnfeeTn22GPz9NNPZ5dddsnkyZOXxq+zgA033DC77LJLpkyZkhNPPLHJ99Pddddduf766z+U1wUAAPigpVLgtt122/y///f/Ul9fn+233z677bZbDjjggGywwQa54YYbsuGGG+bHP/5xk+d885vfzNChQ/Pkk09mww03zP7775/99tsvAwYMyLPPPpt99903X//615f42hdccEGOPvro/OUvf8kuu+ySt956a2n8Sgu49NJLs8Yaa+THP/5xBg4cmOHDh2fw4MHZY4898tWvfjVJ0rFjxw/ltQEAAJKluIjJt7/97dx2223Zaaed8thjj+U3v/lNOnXqlBNOOCGPPPJIk+96S5IOHTpk9OjR+f73v5/+/fvn97//fe68885stNFG+fGPf5ybbrqp2YuMXHzxxTnyyCPz5JNPZtddd83bb7+9tH6tRhtuuGEeeeSRHHDAAXn77bdzyy23pL6+PldddVU+//nPJ0lWW221pf66AAAA81Wq1Wq11iFKd/bZZ2fkyJE5++yzc+KJJzbrOfX19enZs+c/77V8lc7lVVuuHLosWXHFTrWOUJz33lvweleWbPXVF1x4isWbMuX1WkdgOfHBS0Dgw6VetNbUqVOXuFq9T8PN9N577+WZZ55ZYPu9996bM888MyussELjTBwAAMCHYYVaByjFO++8k0022SQbbbRRNtxww3Tu3DkvvPBC/vznPydJzj///EV+MTkAAMDSoMA1U8+ePXPcccflrrvuyh//+MfU19dn5ZVXztChQ3PkkUdm6NChtY4IAAAs41wDVyOugWsd18C1jmvgWs41cK3jGriWcw0cbcU1cLQd9aK1XAMHAACwDFHgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVih1gFIkmqtAxSjoaGh1hGKNHv2e7WOUJxTzr+i1hGK9LGPDa51hOI8//wjtY5QpHnz5tY6QnGmT3+n1hGKNHfO7FpHKM7sObNqHaE41Wo1ze0EZuAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwrXTllVemUqnktNNOq3UUAABgOaHAAQAAFEKBAwAAKIQC9wG33357DjvssGy88cbp0aNHunbtms033zxnnnlmZs2a1Thu8ODBOfTQQ5Mkp59+eiqVSuPtyiuvrFF6AABgWbdCrQO0J1/84hczc+bMbLrpptlss80yderUPProozn55JNzzz335M4770yHDh2yxx57ZO7cuXnwwQez+eabZ4sttmj8GRtssEHtfgEAAGCZpsB9wGWXXZbdd989Xbp0adw2bdq0DB8+PLfddluuvfbajBgxIieddFJ69eqVBx98MPvuu6+FTAAAgDbhFMoPGDZsWJPyliTdu3fPRRddlCS59dZbW/2zZ82alfr6+iY3AACAljAD9y9eeOGF3HHHHXnxxRczffr0NDQ0pFqtNj7WWmeddVZOP/30pRUTAABYDilw/1StVnPcccfloosuaixs/2ratGmt/vkjR47Mscce23i/vr4+/fr1a/XPAwAAlj9OofynG264IRdeeGH69u2bm266Ka+88kpmz56darXauALloopdc3Tq1Ck9evRocgMAAGgJM3D/NGrUqCTJpZdemr322qvJY+PHj69FJAAAgCbMwP3TlClTkiR9+/Zd4LEbb7xxgW0dO3ZMksydO/fDDQYAAPBPCtw/DRgwIEly+eWXNzlVcuzYsTnvvPMWGN+7d+8kyfPPP982AQEAgOWeAvdPRx11VLp27ZpLLrkkm266aQ444IAMGjQoO+20Uw4//PAFxm+33XZZc801c9NNN2Xw4ME57LDD8qUvfSl//OMfa5AeAABYHihw/zRgwICMGzcue++9dyZPnpzRo0fn3XffzWWXXbbQGbjOnTvn9ttvz2677ZYnnngiV155ZX72s5/lr3/9aw3SAwAAywOLmHzAwIEDM3r06IU+trAVKLfZZpvceeedH3YsAACAJGbgAAAAiqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBCVarVarXWI5VF9fX169uxZ6xjAInTqtFKtIxSpV6/1ax2hOJ07d611hCIN2n1YrSMUZ+xd/1PrCEWaO3dOrSMUZ8KEv9Q6QnGq1WrmzZuTqVOnpkePHosdawYOAACgEAoc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ocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKESbF7iXXnopEydObOuXbZGHHnoo7733Xq1jAAAANNEmBa6+vj5XXHFF/uM//iMbbLBB/vSnPzV5vFqt5rrrrsuQIUOyyiqrpHPnztl4441z2mmnZcaMGQv9mW+99VaOP/74bLjhhuncuXNWXXXV7LHHHrnzzjsXOv5vf/tbvva1r2XAgAFZaaWVsuqqq2aTTTbJV7/61Tz//PNNxo4cOTK9evXKV7/61fzxj39cOjsBAADg3/ShFbiGhobceeedOfDAA9OrV698+ctfzoMPPpiddtopAwcObDLuwAMPzPDhw/PYY49liy22yJ577pnp06fn9NNPz84775yZM2c2+dmvvPJKtt1225x//vmZPXt29t1332y55Za5++6786lPfSoXXXRRk/GTJk3KVlttlZ/85CdJkj333DM77bRTOnXqlJ/+9Kd56KGHmowfNmxYVlpppVx++eXZcccdM2DAgHzve99r9zOHAADAsq1SrVarS/MHPvfcc7nqqqtyzTXX5JVXXkmSbLTRRjnooIPyhS98Ieuuu26T8eedd15OOOGEDB48ONddd1169eqVJJk9e3a+/vWv52c/+1lOPPHEnH322Y3P2XvvvXPbbbdl+PDh+cUvfpGOHTsmSR544IF86lOfyqxZszJu3LhsscUWSZLvfOc7+e53v5sjjjgiP/zhD5u8/sSJEzNnzpx85CMfabJ93rx5ufvuu3P11VfnlltuyYwZM1KpVLLzzjvnkEMOyf7775+uXbu2ej/V19enZ8+e/7xXafXPWf4s1T/X5Yi/sZbq3Ln1/30vz7p3X7XWEYrTu/dHljyIBWy29SdrHaE4zz/1pyUPYgGvvvpSrSMU5x//GF/rCMWpVquZN29Opk6dmh49eix27FIpcFOmTMl1112Xq666Ko8++miSZPXVV8/nPve5jBgxIttuu+1Cnzd37tysvfbamTlzZl566aWstdZaTR6fOXNm+vfvn1mzZmXy5Mmpq6vL+PHj85GPfCTdunXL3/72t6y6atMPC9/61rdy4YUX5ktf+lJ++tOfJkm+/vWv59JLL80tt9ySYcOGtfj3mzZtWm6++eZcffXVGTNmTKrVarp165b//M//zMEHH5yddtoplcriPyDPmjUrs2bNarxfX1+ffv36/fOeD9fNp8C1jr+xllLgWkeBazkFrnUUuJZT4FpHgWs5Ba7lWlLg/u1TKE888cSsvfba+cY3vpE///nP2X///XPLLbfk1VdfzY9+9KNFlrck+dOf/pTJkydnhx12WKC8JUmXLl2y9dZbZ8qUKXnhhReSvD/LliR77LHHAuUtSQ466KAkydixYxu3bb311kmSb3/727nttttavEBJ9+7dc8ghh+QPf/hD/va3v+V73/te+vbtmyuvvDI777xz+vfvv8B1ff/qrLPOSs+ePRtv/1feAAAAmuffLnCPPPJIZs2alQ4dOuT444/Pj3/84wwbNiwrrrjiEp87YcKEJMldd92VSqWy0Nvtt9+eJJk8eXKS5NVXX02SrLfeegv9mfO3zz99M0kOOeSQfPazn80zzzyTvffeO6usskoGDRqUM888M//4xz9a9Pv269cvI0eOzE9+8pNss802jb/Hkq6PGzlyZKZOndp4mzRpUoteFwAAYIV/9wecddZZufzyy3PTTTfljDPOyFlnnZVdd901Bx10UPbdd9/FXifW0NCQJNlggw2y4447LvZ1VltttWblWdipjB06dMgNN9yQk046Kbfeemv+8Ic/5JFHHsnYsWNz9tln53e/+1122GGHJf7s5557Ltdcc01++ctfNha2TTbZpPE0ysXp1KlTOnXq1KzfAQAAYGH+7QK3/fbbZ/vtt8+PfvSj3Hzzzbnqqqty55135ve//326deuW/fbbLwcddFB22WWX1NU1nfDr27dvkmTgwIG58sorm/V6vXv3TvL+1wIszPxZvT59+izw2JZbbpktt9wyp512Wurr63PaaafloosuyjHHHNN47d6/euONN3L99dfnmmuuybhx45K8XyaPOOKIHHzwwY2zcAAAAB+2pb4KZfL+yo5XX311rr766sZr13r37p3hw4fnoIMOymabbZbk/YU91lprrTQ0NGTChAkLvabtX81fxKR79+6ZOHFiVl555SaPH3/88Tn//PObLGKyKLNmzUqXLl3SuXPnJt83N3PmzIwePTrXXHNNfv/732fu3LlZccUVM3To0Bx88MH59Kc/3bjyZWtZhbK1LGLSOv7GWsoiJq1jEZOWs4hJ61jEpOUsYtI6FjFpOYuYtFybLmKyMOuss05OOeWU/PWvf82DDz6Yr3zlK5kxY0bOP//8bL755o3XtXXq1CknnHBCpk2blv333z/jxy/4f/Yrr7ySa665pvF+//79s9dee2XatGk5+uijM2fOnMbHHnrooVx66aXp0KFDvvGNbzRuv+aaa/LUU08t8LN/+9vfplqtLrCgyD777JPPf/7zuf322/Oxj30sF198cV555ZXceuut2X///f/t8gYAANAa//YplEuyww47ZIcddsj3v//93HLLLbnqqqvywUm/k046qfHaso033jhbbrll1l9//cyePTvPP/98nnnmmWy22WaNq0smyWWXXZb/+I//yNVXX5377rsv22+/fd58882MGTMm8+bNywUXXND4HXBJcvPNN2fEiBH5yEc+ko997GPp0qVLXn755TzyyCOpq6vLGWec0STzaqutlmOPPTaHHHJIPvaxj33YuwgAAKBZPpRTKFtj9OjRufzyy/PYY49lypQpWWWVVdKvX7/ssssu+dznPpetttqqyfi33norZ511Vm655ZZMmjQpK620Urbddtt861vfyu67795k7P33358bb7wxDz74YCZNmpTp06end+/ejeNrcR2bUyhbq138uRbI31hLOYWydZxC2XJOoWwdp1C2nFMoW8cplC3nFMqWa/Mv8qblFLjW8ufaOv7GWkqBax0FruUUuNZR4FpOgWsdBa7lFLiWq/k1cAAAACx9ChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKocABAAAUQoEDAAAohAIHAABQCAUOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUAgFDgAAoBAKHAAAQCEUOAAAgEIocAAAAIVQ4AAAAAqhwAEAABRCgQMAACiEAgcAAFAIBQ4AAKAQChwAAEAhFDgAAIBCKHAAAACFUOAAAAAKsUKtAyyvqtXqB+/VLAfLC39jLdX0v1Gaq6GhodYRijNv3txaRyjS7Nmzah2hOPPmzal1hCI1NMyrdYTi+De05ebvs+bsu0rVHq6Jv//97+nXr1+tYwAAAO3EpEmT0rdv38WOUeBqpKGhIa+++mq6d++eSqVS6zhN1NfXp1+/fpk0aVJ69OhR6zjFsN9azj5rHfut5eyz1rHfWs4+ax37reXss9Zpr/utWq1m2rRp6d27d+rqFn+Vm1Moa6Surm6J7brWevTo0a7+sEthv7WcfdY69lvL2WetY7+1nH3WOvZby9lnrdMe91vPnj2bNc4iJgAAAIVQ4AAAAAqhwLGATp065Tvf+U46depU6yhFsd9azj5rHfut5eyz1rHfWs4+ax37reXss9ZZFvabRUwAAAAKYQYOAACgEAocAABAIRQ4AACAQihwAAAAhVDgAAAACqHAAQAAFEKBAwAAKIQCBwAAUIj/DyNYjPrfz/0gAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_attention(sentence_tokens, translation, attention)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "循环遍历我们的 `test_data`，得到模型对每个测试句子的翻译。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e90457593ad24140b1965124668d19f6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/1000 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "translations = [\n",
    "    translate_sentence(\n",
    "        example[\"de\"],\n",
    "        model,\n",
    "        en_nlp,\n",
    "        de_nlp,\n",
    "        en_vocab,\n",
    "        de_vocab,\n",
    "        lower,\n",
    "        sos_token,\n",
    "        eos_token, \n",
    "    )[0] for example in tqdm(test_data)\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 评估`bleu`指标\n",
    "从`evaluate`库中加载BLEU指标："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "07463d3eb312408e9ab50269b468af20",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading builder script:   0%|          | 0.00/5.94k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fb6edbb640ff46c0882abe114cb73f6c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading extra modules:   0%|          | 0.00/1.55k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2f9720f5d7b64ea8a0be93f18b9003e9",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading extra modules:   0%|          | 0.00/3.34k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "bleu = evaluate.load(\"bleu\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将目标句子放入列表中。并将我们的翻译从token列表转换为字符串，方法是在它们之间用空格连接，并摆脱`<sos>`和`<eos>`tocken。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions = [\n",
    "    \" \".join(translation[1:-1]) for translation in translations\n",
    "]\n",
    "\n",
    "references = [\n",
    "    [example[\"en\"]] for example in test_data\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义一个函数，该函数对输入字符串进行tocken化。通过将我们的预测tocken与参考tocken进行比较来计算BLEU分数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_tokenizer_fn(nlp, lower):\n",
    "    \n",
    "    def tokenizer_fn(s):\n",
    "        tokens = [token.text for token in nlp.tokenizer(s)]\n",
    "        if lower:\n",
    "            tokens = [token.lower() for token in tokens]\n",
    "        return tokens\n",
    "        \n",
    "    return tokenizer_fn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "tokenizer_fn = get_tokenizer_fn(en_nlp, lower)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后，我们在测试集上计算BLEU指标！\n",
    "\n",
    "我们将我们的“predictions”、“references”和我们的“tokenizer_fn”传递给BLEU指标的“compute”方法，以获取我们的结果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "results = bleu.compute(predictions=predictions, references=references, tokenizer=tokenizer_fn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'bleu': 0.2633405950067028,\n",
       " 'precisions': [0.5873529411764706,\n",
       "  0.3334920634920635,\n",
       "  0.19836206896551725,\n",
       "  0.12377358490566037],\n",
       " 'brevity_penalty': 1.0,\n",
       " 'length_ratio': 1.0415071220707612,\n",
       " 'translation_length': 13600,\n",
       " 'reference_length': 13058}"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们获得了0.263的BLEU分数, 但是训练的时间也翻倍了。\n",
    "\n",
    "\n",
    "通过方法的进步，可以逐渐提高BLEU分数！\n",
    "\n",
    "\n",
    "在下一个笔记本中，我们将使用相同的架构，但使用适用于所有 RNN 架构的一些技巧 - packed padded sequences 和 masking。我们还将实现一些代码，让我们查看 RNN 在解码输出时关注的输入单词。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mindspore211",
   "language": "python",
   "name": "mindspore211"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
